原文地址:NodeJS后端项目开发与生产环境总结NodeJS常用的后端框架有express、koa、sails。国内的框架有一个eggjs,已经在cnode投产了,还有一个thinkjs,类似thinkphp,这里支持一波。每个框架在开发环境和生产环境中都是不同的。这里以koa为例,开发环境和生产环境的区别在于后台模板渲染(ejs、pug)。前后端分离架构参考webpack热更新实现开发环境热更新错误处理前端js代码自动打包生产环境静态缓存(staticcache)内容压缩(gzip)日志文件processguard强制https404处理负载平衡前端js代码混乱压缩开发环境配置热更新(nodemon)nodemon在js文件变化时后悔重新运行程序,在package.json的脚本中添加:dev:'nodemonserver.js'npmrundevnodemon可选配置有很多,错误处理和koa参考nodemon文档,例如app.on('error',err=>{log.error('servererror',err)});如果想把错误抛到浏览器页面,美化错误页面,express可以使用express-error-handler,koa可以用onerror前端js代码(webpack)自动打包。由于是后台模板渲染,所以不能用webpack-dev-server自动刷新。可以做的就是在前端js发生变化后,利用webpack的watch自动打包,当然手动刷新是不可避免的//webpack.config.jsconstconfig={entry:{app:path.resolve(root,'./modules/app.js'),about:path.resolve(root,'./modules/about.js'),},output:{path:path.resolve(root,'./dist'),publicPath:path.resolve(root,'./dist'),文件名:'[name].js'},模块:{规则:[{test:/(\.js)$/,使用:{loader:"babel-loader",},exclude:/node_modules/}]},devtool:'#eval-source-map',watch:true,watchOptions:{poll:1000,//监听修改时间(ms)ignored:/node_modules/,//不监听}};注意source-map一定要打开,否则无法定位错误位置。告知webpack是生产环境还是开发环境,可以使用cross-env,然后在package.json的脚本中添加:"watch":"cross-envNODE_ENV=developmentwebpack--watchwebpack.config.js》开发时应该运行两条命令://nodemonnpmrundev//webpacknpmrunwatchproductionenvironment生产环境一般使用pm2,pm2已经帮我们完成了进程守护和负载均衡。内部实现原理这里不再赘述。具体可以参考pm2文档。//生成pm2配置文件ecosystem.config.jspm2生态系统生成的配置文件已经包含了生产环境的基本要素。更多配置请参考pm2文档,在package.json文件的scripts中添加“prd”:“pm2startecosystem.config.js--envproduction”在生产环境中运行npmrunprd,即可通过进程全局变量获取到环境状态,添加constprdEnv=process.env.NODE_ENV=='production'staticcacheconststaticCache=require('koa-static-cache')if(prdEnv){//staticcacheapp.js中的app.use(staticCache(path.join(__dirname,'public'),{maxAge:365*24*60*60}))}gzipconstcompress=require('koa-compress')if(prdEnv){//gzipapp.use(compress({filter:function(content_type){return/text/i.test(content_type)},threshold:2048,flush:require('zlib').Z_SYNC_FLUSH}))}日志file类似于nginx的access.log和error.log,使用fs模块的appendFile方法输出日志。首先创建一个新文件夹logsconstfs=require('fs')constpath=require('path')if(prdEnv){//loggerapp.use(async(ctx,next)=>{conststart=newDate()awaitnext()constms=newDate()-startfs.appendFile(path.join(__dirname,'logs',ctx.status<400?'access.log':'error.log'),`[${start.toLocaleString()}]${ctx.status}${ctx.method}${ctx.url}-${ms}ms\r\n`)})}forcehttps//forcehttpsapp.use((ctx,next)=>{if(ctx.protocol=='http'){ctx.redirect(ctx.href.replace('http','https'))}else{returnnext()}})404处理创建一个名为notFound.pug的模板,路由后渲染//404app.use(async(ctx)=>{awaitctx.render('notFound')})webpack中前端js代码压缩混淆添加插件//webpack.config.js//提取公共jsnewwebpack.optimize.CommonsChunkPlugin({name:'common'})//压缩代码newwebpack.optimize.UglifyJsPlugin({sourceMap:false,parallel:true,mangle:true,compress:{警告:假,drop_debugger:true,drop_console:true}})//package.json"build":"cross-envNODE_ENV=productionwebpack--configwebpack.config.js"发布应用时需要运行npmrunbuildnpmrunprd
