介绍一个自制的适配ESM在node 环境中的工具 -- uunode

334 阅读2分钟

一、概述

先看一段代码

// index.js
import createMathOperation from './.internal/createMathOperation.js'

const add = createMathOperation((augend, addend) => augend + addend, 0)

console.log(add(6, 4));

export default add

当我们在终端执行 node index.js 时,我们可以得到一个报错:

截屏2021-06-24 下午6.59.40.png

也就是说,我们不可以直接运行这段包含 ESM 的代码。

Node verison 13.2.0 起开始正式支持 ES Modules 特性,有两种方法可以应用:

  1. package.json 中设置 "type": "module"
  2. 将文件后缀改变为 mjs

根据第二个方法,为了便利化调试,我开发了一个命令行工具—— uunode,它会将 js文件在不覆盖原文件的情况下转化为 mjs, 并执行相应的mjs 文件,并返回结果。

二、安装

npm 使用:

npm install uunode -g

yarn 使用:

yarn add uunode -g

(linux 显示没有权限的话请在前面加上 sudo, 即 sudo npm install uunode -g 或者 sudo yarn add uunode -g)

三、使用示例

uunode [example.js]

2021-06-24_2281841392291411363.33.52.gif 如示例所示,当我们运行 uunode [example.js] 时,它会产生一个 .uunode 的文件夹,里面储存着将 mjs 文件(默认不保留文件,你可以加 -k 参数保留文件)。并执行 node .uunode/example.js 返回相应的结果。

你还可以使用 uunode [example.js] -s 去掉 console

参数支持项:

参数值含义
-s去除 console
-k保留生产后的菜单

四、未来

在探索如何写 uunode 的过程中发现了 Deno,也是由 nodejs 的作者Ryan Dahl开发的。

node 不能处理 ESM 模块的问题,将在 Deno 解决。更多关于 deno 的内容,请参考这篇文章。

五、如何编写一个自动化工具

npm publish 会发布一个对应 package.jsonname 的包。

package.json 中, bin 代表对应的指令。

"bin": {
  "uunode": "bin/index.js"
},

在执行完 npm install uunode -g 后可以执行 bin 中对应的指令。

五、更多

  1. 手把手教你写Node.js命令行程序

  2. 如何从零开始开发一个 node.js 命令行(cli)工具

  3. 什么是amd、commonjs、umd、esm?

  4. 2020年我们可以在Node中使用ES Modules了吗