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

时间:2018-09-26 04:26:48

标签: javascript npm node-modules package.json

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

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

我这样设置我的package.json:

export default

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

main: "index.cjs.js",
module: "index.esm.js"

它将自动选择import myPackage from 'my-package' 文件,而不是模块。

我的问题:

在JavaScript文件中执行main时,是否可以导入module文件?

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

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

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

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

What is the "module" package.json field for?

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

当前有一个bug in Rollup,在导入"main"文件后进行编码时,它不会正确显示JSDoc注释,但是在导入{{1 }}文件。

我要避免的解决方法:

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

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

1 个答案:

答案 0 :(得分:2)

仅对主文件不使用扩展名,并且将es6和CommonJS版本作为两个具有相同名称和相同目录但具有不同扩展名的独立文件,所以:

index.js // transpiled CommonJS code for old nodejs
index.mjs // es6 module syntax

package.json中的

{
  "main": "index"
}

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