Node JS后端项目开发与生产环境总结
原文地址:Node JS后端项目开发与生产环境总结

Node JS常用后端框架有express、koa、sails。国产框架有个egg js,已经在cnode投入生产了,还有个think js,类似think php,在此支持一波。每个框架在开发环境与生产环境都有所不同,这里以
koa为例
开发环境与生产环境的区别
建立在后台模板渲染(ejs, pug)的基础上。前后分离架构请参考webpack热更新实现
开发环境
- 热更新
 - 错误处理
 - 前端js代码自动打包
 
生产环境
- 静态缓存(static cache)
 - 内容压缩(gzip)
 - 日志文件
 - 进程守护
 - 强制https
 - 404处理
 - 负载均衡
 - 前端js代码混淆压缩
 
开发环境配置
热更新(nodemon)
nodemon在js文件变化后悔重新运行程序,在package.json的scripts中添加:
dev: 'nodemon server.js'
npm run dev
nodemon还有许多可选配置,具体参阅nodemon文档
错误处理
以koa为例
app.on('error', err => {
  log.error('server error', err)
});
如若想要将错误抛出到浏览器页面和美化错误页面,express可用express-error-handler,koa可用onerror
前端js代码自动打包(webpack)
由于是后台模板渲染,所以没法用webpack-dev-server进行自动刷新。能做的就是利用webpack的watch在前端js改变后自动打包,当然还是免不了手动刷新
// webpack.config.js
const config = {
    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'),
		filename: '[name].js'
    },
    module: {
        rules: [
            {
                test: /(\.js)$/,
                use: {
                    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的scripts中添加:
"watch": "cross-env NODE_ENV=development webpack --watch webpack.config.js"
开发时应运行两个命令:
// nodemon
npm run dev
// webpack
npm run watch
生产环境
生产环境一般使用pm2,pm2已经帮我们完成了进程守护和负载均衡,内部实现原理在此不再赘述,具体参考pm2文档。
// 生成pm2配置文件ecosystem.config.js
pm2 ecosystem
生成的配置文件已包含了生产环境的基本本质。跟多配置请参考pm2文档,在package.json文件的scripts中添加
"prd": "pm2 start ecosystem.config.js --env production"
生产环境下运行
npm run prd
这时我们可以通过process全局变量获取到环境状态,在app.js中添加
const prdEnv = process.env.NODE_ENV == 'production'
静态缓存
const staticCache = require('koa-static-cache')
if(prdEnv) {
    // 静态缓存
    app.use(staticCache(path.join(__dirname, 'public'), {
        maxAge: 365 * 24 * 60 * 60
    }))
}
gzip
const compress = require('koa-compress')
if(prdEnv) {
    // gzip
    app.use(compress({
        filter: function (content_type) {
            return /text/i.test(content_type)
        },
        threshold: 2048,
        flush: require('zlib').Z_SYNC_FLUSH
    }))
}
日志文件
类似nginx的access.log和error.log,利用fs模块的appendFile方法来输出日志。首先在项目根目录下新建文件夹logs
const fs = require('fs')
const path = require('path')
if(prdEnv) {
    // logger
    app.use(async(ctx, next) => {
        const start = new Date()
        await next()
        const ms = new Date() - start
        fs.appendFile(path.join(__dirname, 'logs', ctx.status < 400 ? 'access.log' : 'error.log'), `[${start.toLocaleString()}] ${ctx.status} ${ctx.method} ${ctx.url} - ${ms}ms\r\n`)
    })
}
强制https
// force https
app.use((ctx, next) => {
    if(ctx.protocol == 'http') {
        ctx.redirect(ctx.href.replace('http', 'https'))
    } else {
        return next()
    }
})
404处理
建立一个模板命名为notFound.pug,在路由之后渲染
// 404
app.use(async (ctx) => {
    await ctx.render('notFound')
})
前端js代码压缩混淆
在webpack中添加插件
// webpack.config.js
// 提取公共js
new webpack.optimize.CommonsChunkPlugin({name: 'common'})
// 压缩代码
new webpack.optimize.UglifyJsPlugin({
    sourceMap: false,
    parallel: true,
    mangle: true,
    compress: {
        warnings: false,
        drop_debugger: true,
        drop_console: true
    }
})
// package.json
"build": "cross-env NODE_ENV=production webpack --config webpack.config.js"
发布应用时需运行
npm run build
npm run prd
												
											Node JS后端项目开发与生产环境总结的更多相关文章
- 前端(Node.js)(3)-- Node.js实战项目开发:“技术问答”
		
1.Web 与 Node.js 相关技术介绍 1.1.Web应用的基本组件 web应用的三大部分 brower(GUI)<==>webserver(business logic.data ...
 - iKcamp团队制作|基于Koa2搭建Node.js实战项目教学(含视频)☞ 环境准备
		
安装搭建项目的开发环境 视频地址:https://www.cctalk.com/v/15114357764004 文章 Koa 起手 - 环境准备 由于 koa2 已经开始使用 async/await ...
 - Node.js 从零开发 web server博客项目[express重构博客项目]
		
web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...
 - Node.js 从零开发 web server博客项目[登录]
		
web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...
 - Node.js 从零开发 web server博客项目[项目介绍]
		
web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...
 - Node.js 从零开发 web server博客项目[数据存储]
		
web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...
 - Node.js 从零开发 web server博客项目[koa2重构博客项目]
		
web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...
 - Node.js 从零开发 web server博客项目[安全]
		
web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...
 - Node.js 从零开发 web server博客项目[日志]
		
web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...
 
随机推荐
- 侯捷STL学习(二)--序列容器测试
			
第六节:容器之分类和各种测试(四) stack不提供iterator操作,破坏了容器的独特性,先进先出. 使用容器multiset(允许元素重复) 内部是红黑树,insert操作就保证了排好了序. 标 ...
 - Celery-4.1 用户指南: Workers Guide (Workers 指南)
			
启动工作单元 你可以通过执行以下命令在前台启动工作单元: $ celery -A proj worker -l info 查看启动工作单元的可用命令行选项,可以执行: $ celery worker ...
 - 新版本Ubuntu本地提权漏洞复现
			
该漏洞在老版本中被修复了,但新的版本还存在漏洞 影响范围:Linux Kernel Version 4.14-4.4,Ubuntu/Debian发行版本 Exp下载地址:http://cyseclab ...
 - 2016.9.9《Oracle查询优化改写技巧与案例》电子工业出版社一书中的技巧
			
1.coalesce (c1,c2,c3,c4,...) 类似于nvl但可以从多个表达式中返回第一个不是null的值 2.要在where条件中引用列的别名,可以再嵌套一层查询 select * fro ...
 - Delphi 询问框 汉化
			
Delphi 询问框 汉化 d:\program files (x86)\embarcadero\studio\17.0\source\fmx\FMX.Consts.pas add this file ...
 - 【273】利用ArcPy建立处理数据的脚本
			
这个脚本可以直接运行处理程序,首先在 ArcPy 上面测试,成功后写入文件,下面的代码实现将指定文件夹内部的栅格数据进行 Calculate Statistics 操作,否则在进行专题图制作的时候会出 ...
 - js中的操作符
			
写在前面 js语法 DOM对象(把body,div,p等节点树看成一个对象) BOM对象(把浏览器的地址栏历史记录DOM等装在一个对象) 浏览器是宿主,但js的宿主不限于浏览器,也可以是服务器,如no ...
 - koa2 原生链接mysql
			
1.安装mysql $ npm install mysql 2.代码示例: const mysql = require("mysql"); // mysql.Promise = g ...
 - 数组中的最大值以及最小值的位置变换的问题(C++)
			
将一个5×5的数组中的最大值放到数组的中心位置 分析:遍历数组,找到最大的元素,然后将该元素与中心位置的元素交换位置 #include<iostream> #include <std ...
 - Action层, Service层 和 Dao层的功能区分
			
Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的. Service是管理具体的功能的. Action只负责管理,而Service负责实施. DAO ...