最近在开发Vue实现服务端渲染的时候,采用了Nuxt.js实现SSR(服务端渲染)。 用过react.js的童鞋可能都或多或少接触过Next.js,Nuxt.js 也是类似是一个 Next.js的基于 Vue.js 的通用应用框架。
如果应用需要有SEO的要求的话,Nuxt.js是一个很好的解决方案。但是如果不需要的话,建议 还是客户端渲染,服务端渲染目前还是有一些问题需要解决。这在后面会提到,本篇主要是介绍 一下其部署方案。项目在线地址
部署方式
Nuxt.js 提供了两种发布部署应用的方式:服务端渲染应用部署 和 静态应用部署。
静态文件部署
可利用下面的命令生成应用的静态目录和文件:
$ npm run generate
这个命令会创建一个 dist 文件夹,所有静态化后的资源文件均在其中。将打包后的静态文件 放到Nginx静态服务器即部署成功。
服务端渲染应用部署
部署 Nuxt.js 服务端渲染的应用不能直接使用 nuxt 命令,而应该先进行编译构建,然后再启动 Nuxt 服务,可通过以下两个命令来完成:
$ nuxt build
$ nuxt start
package.json配置如下:
{
"name": "vue-nuxt-template",
"version": "1.0.0",
"description": "Nuxt.js project",
"author": "韦森 <723955399@qq.com>",
"private": true,
"scripts": {
"dev": "nuxt",
"build": "nuxt build",
"start": "PORT=3002 nuxt start",
"generate": "nuxt generate",
"lint": "eslint --ext .js,.vue --ignore-path .gitignore .",
"precommit": "npm run lint"
},
"dependencies": {
"axios": "^0.18.0",
"nuxt": "^1.0.0",
"vue-notifications": "^0.9.0"
},
"devDependencies": {
"babel-eslint": "^8.2.1",
"eslint": "^4.15.0",
"eslint-friendly-formatter": "^3.0.0",
"eslint-loader": "^1.7.1",
"eslint-plugin-vue": "^4.0.0"
}
}
部署配置步骤如下:
- 第一步 Nginx 反向代理配置
端口配置3002即为启动脚本start中的指定端口
server {
listen 80;
server_name c.visonsoft.cn;
location / {
...
proxy_pass http://127.0.0.1:3002; #反向代理
}
}
- 第二步,打包,生成.nuxt/ 文件夹
$ npm run build
- 第三步,选择要部署的文件
可以选择将文件从本机复制到服务器运行,如果感觉太麻烦,直接克隆全部代码放到服务器运行一样的。 如果选择拷贝打包后文件到服务器运行,只需要下面3个目录:
- .nuxt/ 文件夹
- package.json 文件
-
nuxt.config.js 文件(如果你配置proxy等,则需要上传这个文件,建议把它传上去)
- 第四步,启动你的nuxt
$ npm install
$ npm start
遗留问题
内存问题
在阿里云低配机上出现内存膨胀的问题,当然也由于 Node.js 的特殊单线程异步机制,暂不解决。
并发问题
瞬间高并发访问,会导致内存膨胀爆表宕机,经分析,是由于组件缓存引起的,将组件缓存减少至10,问题有所改观,但不明显;
更深原因是,每次用户访问,程序均会重新渲染组件输出,组件数据即在一段时间内驻存在内存中,直到 V8GC 回收。 最终的解决方案是:
使用官方推荐的”使用编码中的 Nuxt.js “方法,自定义Node.js程序的入口,对程序进行一些优化; 如果你对业务和程序都需要有深度掌控的话,我很推荐此方法,它可以使你以管理 Node.js 程序的方式管理应用。
具体的优化方法是使用了一个叫idle-gc的垃圾回收模块来优化内存管理, idle-gc是在node早期版本中被废除的功能,主要负责空闲时的堆内存回收,然后早期被认为有 BUG,经常会导致 CPU 满载,于是从 Node.js 中移除了,此项目作者修复了这个 BUG,并发布了模块。 另外,如果机器配置足够,建议开启缓存,即cache选项,且适当往大的配置,cache 的意义在于使用内存常驻来减轻 CPU 的计算压力,这对于单线程的 Node.js 是很好的业务实践。