前几天node官方发布了6.x版本,官方介绍年底将不会维护node0.12,node0.10等版本,由于我们的node项目当前版本是node0.12,所以着手升级一下我们的服务端使用的node版本,打算升级到node6.x,从官网可以看到当前最新的版本是node6.1.0.
下面将记录整个升级node的过程。
安装nvm(node版本管理工具)
- 安装nvm
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.0/install.sh | bash
- 激活nvm
. ~/.nvm/nvm.sh
设定node镜像源为淘宝的源(速度更快)
export NVM_NODEJS_ORG_MIRROR=https://npm.taobao.org/mirrors/node
安装制定版本的node
- 查看可用版本
nvm ls-remote
- 安装指定版本
node install 6.1.0
验证升级结果
运行指令启动程序
node app.js
报错处理
- 错误显示某些module版本落后
Module version mismatch. Expected 46, got 14 ...
- 执行
npm rebuild
和npm update
- 再次执行
node app.js
==== JS stack trace =========================================
Security context: 0x54fd37c9fa9 <JS Object>#0#
1: .node [module.js:568] [pc=0x2394692a9ce4](this=0x7db1007e01 <an Object with map 0x37d5f043a4f9>#1#,module=0x26b77ba718e9 <a Module with map 0x37d5f041bb79>#2#,filename=0x26b77ba718c1 <String[123]:
2: load [module.js:~447] [pc=0x23946911fd36](this=0x26b77ba718e9 <a Module with map 0x37d5f041bb79>#2#,filename=0x26b77ba718c1 <String[123]:
3: tryModuleLoad(aka tryModuleLoad) [module.js:415] [pc=0x239468a3899d](this=0x54fd3704189 <undefined>,module=0x26b77ba718e9 <a Module with map 0x37d5f041bb79>#2#,filename=0x26b77ba718c1 <String[123]:
2: node::DTraceProbe::Initialize(v8::Local<v8::Object>)
3: node::DTraceProvider::Initialize(v8::Local<v8::Object>)
4: node::DLOpen(v8::FunctionCallbackInfo<v8::Value> const&)
5: v8::internal::FunctionCallbackArguments::Call(void (*)(v8::FunctionCallbackInfo<v8::Value> const&))
6: v8::internal::MaybeHandle<v8::internal::Object> v8::internal::(anonymous namespace)::HandleApiCallHelper<false>(v8::internal::Isolate*, v8::internal::(anonymous namespace)::BuiltinArguments<(v8::internal::BuiltinExtraArguments)1>)
7: v8::internal::Builtin_HandleApiCall(int, v8::internal::Object**, v8::internal::Isolate*)
8: 0x23946890961b
- 访问服务之后确定只是一些报警处理,查询谷神(google)之后发现目前6.x版本对某些弃用的包使用还在支持中(或者修复中),所以如果追求最新的node版本,到此就可以使用了
降低node版本到稳定版本
每次启动程序这么多的warning信息很有友好,所以选用一个稳定的版本很重要,所以降低到稳定版本
- 运行
nvm install 5.11.1
,node app.js
[Error: Module version mismatch. Expected 47, got 48.]
{ [Error: Cannot find module './build/default/DTraceProviderBindings'] code: 'MODULE_NOT_FOUND' }
{ [Error: Cannot find module './build/Debug/DTraceProviderBindings'] code: 'MODULE_NOT_FOUND' }
[Error: Module version mismatch. Expected 47, got 48.]
{ [Error: Cannot find module './build/default/DTraceProviderBindings'] code: 'MODULE_NOT_FOUND' }
{ [Error: Cannot find module './build/Debug/DTraceProviderBindings'] code: 'MODULE_NOT_FOUND' }
- 重新编译和更新
npm build
,npm update
,node app.js
最终ok!
小结
- node6.x暂时不是稳定版本,升级时会遇到一个模块版本不适配的情况,可以通过
npm rebuild
,npm update
,npm install some_module@certain_version
解决 - 建议先使用稳定的版本node5.x
- 从node0.12升级到node5.x或者node6.x版本的一大好处是,之前的
node --harmony
可以直接换成node
,即5.x和6.x已经很好的支持了ejs6的特性,包括generetor function的使用。