美文网首页Node.js
[Node.js] 使用babel让模块兼容node 4

[Node.js] 使用babel让模块兼容node 4

作者: 何幻 | 来源:发表于2019-03-29 11:47 被阅读1次

    1. 背景

    Node.js LTS(Long Time Support) 的第一个版本是 4.2.0
    我们可以用 nvm 查看下,

    $ nvm ls-remote --lts
    ->       v4.2.0   (LTS: Argon)
             v4.2.1   (LTS: Argon)
             v4.2.2   (LTS: Argon)
    ...
    

    虽然目前已经发布了很多Node.js版本了,但是还是有一些在用Node 4.2.0,
    不幸的是,Node 4.2.0 甚至不支持非严格模式下使用 let

    (1)新建一个 index.js 文件

    let a = 1;
    

    (2)使用 nvm 将 Node 切换到 4.2.0

    $ nvm install 4.2.0
    Downloading and installing node v4.2.0...
    Downloading https://nodejs.org/dist/v4.2.0/node-v4.2.0-darwin-x64.tar.gz...
    ######################################################################## 100.0%
    Computing checksum with shasum -a 256
    Checksums matched!
    Now using node v4.2.0 (npm v2.14.7)
    
    $ node --version
    v4.2.0
    

    (3)执行一下 index.js

    $ node index.js
    /Users/.../index.js:1
    (function (exports, require, module, __filename, __dirname) { let a = 1;
                                                                  ^^^
    
    SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode
        at exports.runInThisContext (vm.js:53:16)
        at Module._compile (module.js:414:25)
        at Object.Module._extensions..js (module.js:442:10)
        at Module.load (module.js:356:32)
        at Function.Module._load (module.js:311:12)
        at Function.Module.runMain (module.js:467:10)
        at startup (node.js:134:18)
        at node.js:961:3
    

    因此,发布 npm 包的时候,如果目标用户使用了 Node 4.2.0,就会出问题,
    需进行兼容性处理。

    2. target node 4.2.0

    为了实现兼容性,我们可以在发布模块之前,先进行一次 babel 转译,具体步骤如下。

    2.1 先切换到工作用的 Node 版本

    $ nvm use 10.15.0
    Now using node v10.15.0 (npm v6.4.1)
    
    $ node --version
    v10.15.0
    

    2.2 将 index.js 放到 src/ 目录中

    目录结构如下,

    .
    ├── package.json
    └── src
        └── index.js
    

    2.3 修改 package.json

    (1)向 package.json 中添加 babel 相关的 依赖 和 配置

    {
      ...,
      "babel": {
        "presets": [
          [
            "@babel/preset-env",
            {
              "targets": {
                "node": "4.2.0"
              }
            }
          ]
        ]
      },
      "devDependencies": {
        "@babel/cli": "^7.2.3",
        "@babel/core": "^7.4.0",
        "@babel/preset-env": "^7.4.2"
      }
    }
    

    (2)向 package.json 中添加 npm scripts

    {
      ...,
      "scripts": {
        ...,
        "build": "babel src -d dist -D"
      },
      ...
    }
    

    其中,-d--out-dir的简写,用于指定编译产物目录。

    -D--copy-files的简写,用于拷贝不可编译的文件,
    例如 .json 文件,如果不拷贝过去,用相对路径引用时就出错了。

    (3)修改 package.json 的 main 字段

    {
      ...,
      "main": "dist/index.js",
      ...
    }
    

    2.4 安装依赖,并执行构建

    $ npm i
    $ npm run build
    

    目录结构如下,我们把 src/ 目录编译到了 dist/ 中。

    .
    ├── dist
    │   └── index.js
    ├── package.json
    └── src
        └── index.js
    

    参考

    Node.js
    Node.js Release Working Group
    nvm
    babel configuration: package.json
    npm scripts
    npm-package.json: main

    相关文章

      网友评论

        本文标题:[Node.js] 使用babel让模块兼容node 4

        本文链接:https://www.haomeiwen.com/subject/tiakbqtx.html