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 ...
随机推荐
- PowerDesigner CDM中取消默认不能存在同名主键的方法
This data item is already used in a primary identifier.Normalization rules prevent ... 处理的方法为: 菜单栏上的 ...
- cron job error : c queue max run limit reached
在cron job的日志中发现以下报错: ! c queue max run limit reached Wed Aug 28 12:56:00 2013 ! rescheduling a cron ...
- UML设计九种图例
一.作为一种建模语言,UML的定义包括UML语义和UML表示法两个部分. UML语义:描述基于UML的精确元模型定义. UML表示法:定义UML符号的表示法,为开发者或开发工具使用这些图形符号和文本语 ...
- Qt creator 使用qwt
.pro中添加 LIBS += -L”C:\Qt\Qt5.3.2\5.3\msvc2013_opengl\lib” -lqwt INCLUDEPATH += "C:\Qt\Qt5.3.2\5 ...
- os模块 os.stat('path/filename') os.path.dirname(path) os.path.exists(path) os.path.join(path1[, path2[, ...]])
提供对操作系统进行调用的接口 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相当于 ...
- 关于android通过shell修改文件权限的学习
首先是文件的读写属性(下图): 要通过shel命令l修改文件权限: 1.首先在cmd里输入adb shell 命令进入编辑模式 2.用cd命令进入到想要修改的文件目录,不知道的时候可以用ls 命令列表 ...
- JQuery利用css()修改样式后 hover失效的解决办法
执行完代码后发现写在样式表中的hover效果失效,改了好几遍差点重新写函数,后来发现很简单,是优先级的问题,css()中的内容覆盖了之前的样式 只需要在样式后写!important即可解决! .fil ...
- Node内存限制与垃圾回收
对象分配 所有的JS对象都是通过堆来进行分配的.使用process.memoryUsage()查看使用情况Node.js 中文网文档 process.memoryUsage() { rss: , he ...
- HTML中关于url、scr、href的区别
URL是什么 URL:Uniform Resource Locators(统一资源定位器)的简写,Web浏览器通过URL从Web服务器请求页面. url不是属性,src和href是属性,src用于替换 ...
- HDU 5038 Grade (水题,坑题)
题意:给 n 个数,输出众数,但是如果所有的频率都相同但数不同输出 Bad Mushroom. 析:直接记录个数直接暴力就,就是要注意只有一种频率的时候. 代码如下: #pragma comment( ...