如何在package.json中选择'模块'而不是'主'文件

mes*_*eeb 5 javascript npm node-modules package.json

我创建了一些npm模块并将其编译为:

  • commonJS(使用exports.default =)和
  • esm(使用export default

我像这样设置package.json:

main: "index.cjs.js",
module: "index.esm.js"
Run Code Online (Sandbox Code Playgroud)

当我npm安装软件包时,我可以像这样简单地导入它:

import myPackage from 'my-package'
Run Code Online (Sandbox Code Playgroud)

它将自动选择main文件,而不是模块。

我的问题:

在JavaScript文件中module执行操作时import myPackage from 'my-package',是否可以导入文件?

为什么我为“ main”选择commonJS文件:

我注意到使用Node esm无法导入文件,因为export default它必须是commonJS。我有一些简单的辅助JS函数,例如thisthis,我希望它们可以被最广泛的读者使用。这就是为什么我选择cjs"main"中的package.json路径。

为什么在package.json中定义一个单独的“模块”:

许多著名的库(例如Vue.js)已经在执行此操作。查看有关此Stackoverflow线程的更多信息:

“模块” package.json字段的作用是什么?

为什么我要能够导入“模块”文件而不是“主”文件:

Rollup中当前存在一个错误,错误在导入cjs文件后进行编码时无法正确显示JSDoc注释,但在导入文件时可以正常工作es

我要避免的解决方法:

只需将“ main”设置为esmpackage.json中的文件,对不对?但是,所有在Node应用程序中使用我的软件包的用户将无法再使用它...

我对这一切也很困惑,但我认为我做了足够的研究以弄清所有这些。话虽如此,如果有人知道更好的方法或任何其他建议,请在下面的评论中告诉我!!

Rem*_*iak 5

只是不要为主文件使用扩展名,并且将 es6 和 CommonJS 版本作为两个单独的文件,它们具有相同的名称和相同的目录,但具有不同的扩展名,因此:

index.js // transpiled CommonJS code for old nodejs
index.mjs // es6 module syntax
Run Code Online (Sandbox Code Playgroud)

并在package.json

{
  "main": "index"
}
Run Code Online (Sandbox Code Playgroud)

如果节点使用--experimental-modules标志启动,它将使用*.mjs文件,否则使用*.js.

  • 作者建议他们希望他们的辅助函数“可供最广泛的受众使用”,而 `.mjs` 是[不](https://tools.ietf.org/html/rfc4329#section-8.2) [关联](https://据我所知,www.iana.org/assignments/media-types/application/javascript)以及任何脚本媒体类型。 (2认同)