node0.12升级到6.x 实战

前几天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 rebuildnpm 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.1node 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的使用。
上一篇:Android中读图片Exif信息的方法


下一篇:JAVA代码规范笔记(上)