javascript – 如何在package.json中选择’module’而不是’main’文件

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

> commonJS(使用exports.default =)和
> esm(使用导出默认值)

我像这样设置我的package.json:

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

当我在npm安装包时,我简单地导入它:

import myPackage from 'my-package'

它会自动选择主文件,而不是模块.

我的问题:

有没有办法在JavaScript文件中从’my-package’导入myPackage时导入模块文件?

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

我注意到使用Node,导入esm文件是不可能的,因为导出默认,它必须是commonJS.我有一些简单的帮助JS函数,如thisthis,我希望它们可以用于最广泛的受众.这就是为什么我选择cjs作为package.json中的“主”路径.

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

许多着名的图书馆如Vue.js已经在这样做了.请参阅有关此Stackoverflow线程的更多信息:

What is the “module” package.json field for?

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

目前有一个bug in Rollup,它在导入cjs文件后编码时无法正确显示JSDoc注释,但在导入es文件时它确实有效.

我想避免的解决方法:

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

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

最佳答案 只是不要对主文件使用扩展名,并将es6和CommonJS版本作为两个具有相同名称且位于同一目录中但具有不同扩展名的单独文件,因此:

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

并在package.json中:

{
  "main": "index"
}

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

点赞