原文地址: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.jsonscripts中添加:

dev: 'nodemon server.js'
npm run dev

nodemon还有许多可选配置,具体参阅nodemon文档

错误处理

以koa为例

app.on('error', err => {
log.error('server error', err)
});

如若想要将错误抛出到浏览器页面和美化错误页面,express可用express-error-handlerkoa可用onerror

前端js代码自动打包(webpack)

由于是后台模板渲染,所以没法用webpack-dev-server进行自动刷新。能做的就是利用webpackwatch在前端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.jsonscripts中添加:

"watch": "cross-env NODE_ENV=development webpack --watch webpack.config.js"

开发时应运行两个命令:

// nodemon
npm run dev // webpack
npm run watch

生产环境

生产环境一般使用pm2pm2已经帮我们完成了进程守护和负载均衡,内部实现原理在此不再赘述,具体参考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
}))
}

日志文件

类似nginxaccess.logerror.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后端项目开发与生产环境总结的更多相关文章

  1. 前端(Node.js)(3)-- Node.js实战项目开发:“技术问答”

    1.Web 与 Node.js 相关技术介绍 1.1.Web应用的基本组件 web应用的三大部分 brower(GUI)<==>webserver(business logic.data ...

  2. iKcamp团队制作|基于Koa2搭建Node.js实战项目教学(含视频)☞ 环境准备

    安装搭建项目的开发环境 视频地址:https://www.cctalk.com/v/15114357764004 文章 Koa 起手 - 环境准备 由于 koa2 已经开始使用 async/await ...

  3. Node.js 从零开发 web server博客项目[express重构博客项目]

    web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...

  4. Node.js 从零开发 web server博客项目[登录]

    web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...

  5. Node.js 从零开发 web server博客项目[项目介绍]

    web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...

  6. Node.js 从零开发 web server博客项目[数据存储]

    web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...

  7. Node.js 从零开发 web server博客项目[koa2重构博客项目]

    web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...

  8. Node.js 从零开发 web server博客项目[安全]

    web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...

  9. Node.js 从零开发 web server博客项目[日志]

    web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...

随机推荐

  1. 杂项-IIS:发布杂项

    ylbtech-杂项-IIS:发布杂项 1. 测试连接返回顶部 1.1.授权 无法验证对路径的访问. 1.2.详情信息 服务器配置为将传递身份验证和内置帐户一起使用,以访问指定的物理路径.但是,IIS ...

  2. Spring MVC配置详解(2)---bai

    web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2 ...

  3. 开发环境入门 linux基础 (部分) 归档 压缩 Vi编译器 系统分区

    归档 压缩 Vi编译器 系统分区 1.使用cat命令进行文件的纵向合并          1) 使用cat命令实现文件的纵向合并:          a) 例如:将用户信息数据库文件和组信息数据库文件 ...

  4. elasticsearch(4) 安装 (两台)

    环境: centos7  jdk8   elasticsearch1.7.1 安装JDK 确认现有JDK版本 # java –version 安装以及配置环境变量 # tar zxvf jdk-8u6 ...

  5. Android Binder 系统学习笔记(一)Binder系统的基本使用方法

    1.什么是RPC(远程过程调用) Binder系统的目的是实现远程过程调用(RPC),即进程A去调用进程B的某个函数,它是在进程间通信(IPC)的基础上实现的.RPC的一个应用场景如下: A进程想去打 ...

  6. checked多选,取消,反选

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. day35 02-Hibernate持久化对象状态及状态转换

    hibernate内置有一个c3p0,不用引入c3p0的jar包也行. 现在其实可以不用去创建表和实体类.因为hibernate可以自动帮我们生成.只要把映射建好了它就可以自动帮我们生成. 创建实体类 ...

  8. [poj2976]Dropping tests(01分数规划,转化为二分解决或Dinkelbach算法)

    题意:有n场考试,给出每场答对的题数a和这场一共有几道题b,求去掉k场考试后,公式.的最大值 解题关键:01分数规划,double类型二分的写法(poj崩溃,未提交) 或者r-l<=1e-3(右 ...

  9. 按钮控件JButton的使用

    ---------------siwuxie095                             工程名:TestUI 包名:com.siwuxie095.ui 类名:TestButton. ...

  10. Ros学习调试——rqt_console

    1.rqt_console rqt_console:ROS日志框架(logging framework)的一部分,用来显示节点的输出信息 rqt_logger_level:允许我们修改节点运行时输出信 ...