javascript - 我们还需要付出所有努力来为 NPM 预编译软件包吗?

标签 javascript typescript npm precompile es6-modules

我目前正在开发一个项目,其中会有很多 npm 包。我想对这个项目采取更激进的方法。因此,不应再预编译任何文件。在包的 src 文件夹中,只有 d.ts、ts、js、mjs 文件(正如我所说,它们中的任何一个都不应该再被预编译)。我这样做是出于懒惰,因为我认为是时候停止预编译文件了!

我的意思是我应该创建多少个变体? ESModules、AMD、CommonJs、SystemJS?

我的简单想法是:保持原样(从'x'导入x,导出foo = 123),使用该包的开发人员已经拥有正确的工具(Babel,Typescript)!还是不?

第二个问题是:包应该编译到哪个级别? ES3、ES6?只使用现代浏览器并且只支持它们的用户打包什么? 会differential loading这是正确的方法吗? 我只见过HTML文件环境下的差异加载。所以作为一个起点!如果开发人员有选择地使用这些包,那么对我来说情况并非如此。

具体来说,我的问题是:我们还需要付出所有这些努力吗?目前最低的共同点是什么?我不知道统计数字,但我感觉每个人都在他的项目中使用编译器/预处理器(Babel、PostCss)?

你对此有何看法?

最佳答案

根据我的经验,CommonJS 和 ES 模块是当今的相关技术。你可能决定跳过 CommonJS,那么你就可以不用转译了。然而,许多框架和其他库仍然依赖 CommonJS,并且无法使用 ES 模块。

作为一种轻量级方法,您可以执行以下操作:

首先:默认将所有内容编写为 ES 模块,并将您的包设置为默认用作 ES 模块(例如设置 "type":"module" 在 package.json 中并使用 .mjs 作为文件结尾)。

然后:使用 Babel,但仅用于创建模块的 CommonJS 后备。这可能看起来像这样:

将以下开发依赖项添加到您的项目中。 (还有其他用于特殊语法情况的 Babel 插件;Babel 通常会告诉你它需要哪些):

npm install --save-dev @babel/cli @babel/core @babel/plugin-syntax-import-meta @babel/plugin-transform-modules-commonjs

然后将以下 block 添加到您的 package.json 中:

"babel": {
    "plugins": [
        [ "@babel/plugin-transform-modules-commonjs" ],
        [ "@babel/plugin-syntax-import-meta" ]
    ]
}

现在您可以使用一行简单的 shell 代码将 ES 模块转换为 CommonJS:

# assuming your ES modules are in the lib/ directory
for script in $(find lib/ -iname '*.mjs' | grep -v test.mjs | sed -e 's|.mjs||g'); do
    npx babel $script.mjs > $script.cjs
done

您还可以将其作为脚本添加到 package.json 中。

"scripts": {
    "build": "for script in $(find lib/ -iname '*.mjs' | grep -v test.mjs | sed -e 's|.mjs||g'); do npx babel $script.mjs > $script.cjs; done"
}

现在您可以使用 npm run build 运行它,将其添加为提交 Hook ,或者在推送到 NPM 注册表之前运行它。您还可以构建到与 ES 模块所在位置不同的文件夹,并通过 .gitignore 排除该文件夹。

这就是我创建我的几个库的方式(出于完全相同的原因),并且它在 CommonJS 和 ES 模块环境中都能完美运行。

顺便说一句,NodeJS 有一些关于将包作为 ES 模块和 CommonJS 运输的文档:https://nodejs.org/api/esm.html#esm_dual_commonjs_es_module_packages

关于javascript - 我们还需要付出所有努力来为 NPM 预编译软件包吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60863024/

相关文章:

node.js - 无法通过Kubernetes上的Node.Js连接到Elasticsearch(证书链中的自签名证书)

sql - 如何在 TypeORM 迁移中指定列名大小写

node.js - Docker:未找到 npm

javascript - 尝试更改父级的 jQuery 单击处理程序会触发新的单击事件

css - Angular:如何更改 <mat-nav-list> 中的图标?

javascript - 从 JSON 元素的内容构造 URL 以避免输出中出现编码字符的正确方法是什么?

node.js - RollupJS `resolve failed: Error: Cannot find module ' babel-runtime'`

node.js - 如何捕获 node.js 中的 utf-8 解码错误?

javascript - 从逗号分隔的字符串中删除重复项

java - jquery-1.7.1.min.js 编译报错