资讯专栏INFORMATION COLUMN

老项目改造记

SimonMa / 3169人阅读

摘要:前言老项目,项目情况端配置运行环境方面有些人开发环境是,有些是。以我的开发环境为例老项目的运行,开发时需要先执行一个脚本经历过一次风波之后做的人走光啦,但是老项目要继续维护。老项目改造其实还有不少坑,等我想起来再慢慢更新。

前言

老项目,React + PHP + nginx

项目情况 PHP端配置

PHP运行环境方面:有些人开发环境是wamp(apache + PHP),有些是np(Nginx + PHP)。

操作系统方面:大部分是win环境,少部分是MacOS系统,而服务器却是centOS系统。

目录结构

前端代码是和PHP代码放一起的

问题

这样造成什么情况呢?

有时候PHP开发使用redis做缓存,提交了代码,我拉下来后,发现接口报错,原来是我的PHP没有redis.dll这个文件,跑去问PHP拿dll文件,结果dll的版本和我的PHP版本不匹配,严重影响开发效率。

为了配合运营和推广,服务器上的nginx把线上的链接做了重写,例如:/item_info?id=xxx 变成 /item-info-id-xxx.html,我们前端都要把自己的nginx配置修改一遍,而我们用apache的同学,就要请教运维同学了。

启动np的脚本不是很稳定,有时候默默的自己关闭了,看到接口报错,会甩锅PHP同学,其实是自己的PHP进程崩溃了。

还有一种情况就是,假设周末你在家,需要紧急修改线上代码,你改好jsx文件后发现,自己没装PHP环境!wtf???

线上的nginx配置不能完全拿来用,比如nginx会根据你的hostname做处理,比如重写什么的,但是我本地一般都是127.0.0.1,虽然说可以修改hosts文件,把线上域名指向本机,但是改来改去很麻烦。

以我的开发环境为例(nginx1.11 + php5.5 + win10)

老项目的运行,开发时需要先执行一个cmd脚本

@echo off

echo Starting PHP FastCGI...
cd "E:/np/php-5.5.26/"
start /b php-cgi.exe -b 127.0.0.1:9000 -c E:/np/php-5.5.26/php.ini

echo Starting nginx...
cd "E:/np/nginx-1.11.1/"
start /b nginx.exe

========================经历过一次**风波之后================================

做php的人走光啦,但是老项目要继续维护。

现在处在这种尴尬的境地:老项目的不是那么重要,请PHP的开发来呢,成本太高,而且工作量不大,不请呢,遇到PHP端的Bug没办法解决。

最后经过考量,我决定用Nodejs来解决。

使用Nodejs的解决方式

我使用Koa框架来作为Server

接口调用

由于深受本地np环境的折磨我决定使用反向代理,将对/api/的请求转发到线上,这样就可以免去本地运行PHP的烦恼啦。

//反向代理
const proxy = require("koa-proxies");
app.use(proxy("/api", {
    target: isDev ? "http://test-m.xxx.com:80" : "http://m.xxx.com:80",
    changeOrigin: true,
    logs: true
}));

这里有个思考,其实如果当时把域名写死,也可以免去反向代理的麻烦,但是想到如果域名一旦发现变动,修改起来就可能容易出错了。。。

rewrite重写

nginx的重写指令如下

 rewrite  ^/groupinfo-(.*)-(.*).html?(.*)$     /groupinfo.html?$1=$2&$3    last;
 rewrite  ^/selection/brand_detail-(.*)-(.*)html?(.*)$          /selection/brand_detail.html?$1=$2&$3   last;

使用koa-rewrite中间件,复制黏贴下就可以用了。

const rewrite = require("koa-rewrite");

app.use(rewrite(new RegExp("^/groupinfo-(.*)-(.*).html?(.*)$"), "/groupinfo.html?$1=$2&$3"));

app.use(rewrite(new RegExp("^/selection/brand_detail-(.*)-(.*)html?(.*)$"), "/selection/brand_detail.html?$1=$2&$3"));

这样就可以一劳永逸啦,一次修改,同时生效,大家再也不需要骚扰运维同学了。

静态文件

nginx还有一个功能就是静态文件服务器,这个也可以使用Koa的中间件完成。

const serv = require("koa-static-server");


app.use(serv({
        rootDir: path.resolve(__dirname, "../../public/"),
    });
);
整个server端代码
/**
 * Created by chenchen on 2017/2/27.
 */
const Koa = require("koa");
let Router = require("koa-better-router");
const serv = require("koa-static-server");
const proxy = require("koa-proxies");
const path = require("path");
var app = new Koa();

const isDev = process.env.NODE_ENV !== "production";


let router = Router({prefix: "/api"}).loadMethods();
var body = require("koa-better-body");
const rewrite = require("koa-rewrite");


//反向代理
app.use(proxy("/api", {
    target: isDev ? "http://test-m.xxxx.com:80" : "http://m.xxxx.com:80",
    changeOrigin: true,
    logs: true
}));

//rewrite
app.use(rewrite(new RegExp("^/groupinfo-(.*)-(.*).html?(.*)$"), "/groupinfo.html?$1=$2&$3"));


app.use(rewrite(new RegExp("^/selection/brand_detail-(.*)-(.*)html?(.*)$"), "/selection/brand_detail.html?$1=$2&$3"));


app.use(body());


app.use(function (ctx, next) {

    console.log(ctx.path);

    return next();
});

app.use(serv({
        rootDir: path.resolve(__dirname, "../../public/"),
        // rootPath: "/",
        // log: true,
        // index: "noaccess.txt" //避免 路由 / 和 静态文件 /index.html冲突
    })
);


app.listen(8088, _ => {

    console.log("app start at 8088");
});
测试

最后,添加一条npm script

"start-test-server": "nodemon --harmony server/index",

执行

npm run start-test-server

测试下,妥妥的!

编译优化

老项目使用webpack打包,现在看当时的配置文件webpack.config.js,第一反应就是,哪个辣鸡写的?

new webpack.optimize.UglifyJsPlugin({ compress: { warnings: false } }) 这个插件怎么能在开发的时候使用?

(后来想起来,其实就是我写的)。。。

webpack打包,webpack1升级到webpack2

参考迁移教程

webpack编译优化

这里我就不重复了,可以参考我写的文章

总结

利用现有资源,用Nodejs去配合PHP,优化老项目,同时拓展自己解决问题的思路,我觉得是一次很有趣的经历。

老项目改造其实还有不少坑,等我想起来再慢慢更新。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/82067.html

相关文章

  • underscore 诞生(二)—— 链式调用与混入(mixin)

    摘要:上篇文章讲述了的基本结构搭建,本文继续讲链式调用与混入。获得一个经包裹后的实例标识当前实例支持链式调用小试牛刀返回的为一个实例对象,后面的方法判断属性是否为为的话再调用一次方法再返回原来实例即可。 showImg(https://segmentfault.com/img/bVbrSwH?w=1374&h=773); 上篇文章讲述了 underscore 的基本结构搭建,本文继续讲链式调...

    yck 评论0 收藏0
  • 前端从“刀耕火种”过渡到到“现代化”的自动构建工具(在ThinkPHP的项目里使用webpack)

    摘要:后来换了一家公司,没有前端开发这个职位,是从转过去的,因为项目需要,渐渐的也就坐实了这个岗位。假如我们以前的代码是这样的放到全局作用域。此时的代码,其实已经具备了进入现代期的要求,那就是规范模块化。 我是14年入的程序员大军,当时主java兼具前端开发的活儿,在现在看来的一些流开发框架和新兴思想,早在node.js开始进入大家视野的时候就流行起来了,只是在那时博主并没有关注前端的生态圈...

    IamDLY 评论0 收藏0
  • 大会实录|清华徐葳:人工智能让数据中心更好运维

    摘要:清华大学数据中心运维那点事儿我徐葳显然是个科研人员,同时还管理很多行政事务等,但有些人命不好,就是系统管理员的命。最后,数据中心现在如此复杂,怎么能再利用一些人工智能的东西放在数据中心里帮助运维。 showImg(https://segmentfault.com/img/remote/1460000012115241?w=159&h=159); 嘉宾介绍:徐葳,清华大学交叉信息研究院助...

    bergwhite 评论0 收藏0
  • 我是如何一步步“改造”redux的

    摘要:但是在使用开发的过程中还是感觉不太顺手,本文将阐述我是如何对进行一步步改造以适应个人和团队开发需求的。所以说,我们如何在保证的设计原则以及项目规范性上,对其进行简化改造,是我这里需要解决的问题。 从Vue换到React+Redux进行开发已经有半年多的时间,总的来说体验是很好的,对于各种逻辑和业务组件的抽象实在是方便的不行,高阶组件,洋葱模型等等给我带来了很多编程思想上的提升。但是在使...

    jemygraw 评论0 收藏0

发表评论

0条评论

SimonMa

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<