HOME

编写跨平台的 Node.js 代码

2018-2-22 王赛

Node.js 最强大的一点就是“跨平台”。只要在编码时稍微注意一下,你的代码就通吃 Windows、Linux 和 OSX 平台。

Node.js 是跨平台的,也就是说它能运行在 Windows、OSX 和 Linux 平台上。很多 Node.js 开发者都是在 OSX 上做开发的,然后再将代码部署到 Linux 服务器上。由于 OSX 和 Linux 都是基于 Unix 的,因此两者共性很多。Windows 也是 Node.js 官方支持的平台,只要你通过正确的方式写代码,就能在各个平台上毫无压力的跑起来。

路径

为 Node.js 写代码,碰到的最大的问题就是“路径”。Node.js 平台其实已经做了很多工作帮你屏蔽平台间的差异,但是,如果你以错误的方式写代码的话,在 Windows 平台上就会遇到大麻烦。

比如,你想通过字符串拼接的方式生成一个路径:

var foo = 'foo';  
var bar = 'bar';  
var filePath = foo + '/' + bar + '/';  

在 OSX 和 Linux 平台上运行的话毫无压力,但是 Windows 平台的路径分隔符是 \\,所以你必死无疑!

其实,Node.js 自带的 path 模块已经给出了现成的工具用于处理跨平台的路径操作。比如,我们可以使用 path.join 函数:

var filePath = path.join(foo, bar);  
// 'foo/bar' on OSX and Linux
// 'foo\\bar' on Windows

使用 path.resolve 在文件系统中移动

path.resolve 提供了在文件系统中到处移动的功能,并且能够提供跨平台兼容性。根据文档中的说明,你可以将这个函数看作是一系列的 cd 指令,最后输出一个单一的路径。

path.resolve('../', '/../', '../')  
// '/home' on Linux
// '/Users' on OSX
// 'C:\\Users' on Windows

使用 path.normalize 创建可靠的路径

如果你正在这样做:

var filePath = '/home/george/../folder/code';  

建议你使用 path.normalize 函数。此函数能够帮你生成正确的最终路径,而且跨平台。

var filePath = path.normalize('/home/george/../folder/code');  
// '/home/folder/code'

使用 path.join 合并目录名

再回顾一下前面所看到的合并字符串并生成路径的案例,千万不要犯这样的错误!

如果你需要合并多个路径的话,请使用 path.join,这个函数还能规范化最后生成的路径哦!

path.join('foo', '..', 'bar', 'baz/foo');  
// 'bar/baz/foo' on OSX and Linux
// 'bar\\baz\\foo' on Windows

package.json 文件中定义可执行的脚本

假如你有这样一个可执行的脚本 -- npm-postinstall -- 放在 bin 目录下:

#!/usr/bin/env node
console.log('node modules installed!');  

如果你在 package.json 文件中定义了一个可执行的脚本,你会发现 Windows 不鸟你。

{
  "name": "some-app",
  "version": "0.0.1",
  "authors": [
    "George Ornbo <george@shapeshed.com>",
  ],
  "scripts": {
    "postinstall": "./bin/npm-postinstall"
  }
}

解决办法是使用 node 来执行脚本。

{
  "name": "some-app",
  "version": "0.0.1",
  "authors": [
    "George Ornbo <george@shapeshed.com>",
  ],
  "scripts": {
    "postinstall": "node bin/npm-postinstall"
  }
}

上面的方式就能在所有平台上运行了。

使用 os 模块

如果你的代码需要与系统平台有更多的沟通,请仔细看看 Node.js 中的 os 模块吧。

var os = require('os');  
os.platform();  
// 'linux' on Linux
// 'win32' on Windows 32-bit
// 'win64' on Windows 64-bit
// 'darwin' on OSX

总结

Node.js 平台的最大优势就是跨平台开发、跨平台部署、跨平台运行。只要稍加运用上面的知识就能轻松的开发出跨平台的代码。

文章来源:http://www.ghostchina.com/writing-cross-platform-node-js/