首页 > 解决方案 > 如何在 package.json 中选择“模块”而不是“主”文件

问题描述

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

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

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

当我 npm install 包并简单地导入它时,如下所示:

import myPackage from 'my-package'

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

我的问题:

有没有办法在 JavaScript 文件中导入文件moduleimport myPackage from 'my-package'

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

我注意到使用 Node,导入esm文件是不可能的export default,因为它必须是 commonJS。我有一些简单的辅助 JS 函数,比如thisthis,我希望它们能够被最广泛的受众使用。这就是为什么我选择package.jsoncjs中的"main"路径。

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

许多像 Vue.js 这样的著名库已经在这样做了。请参阅有关此 Stackoverflow 线程的更多信息:

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

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

Rollup中目前存在一个错误,它在导入文件后编码时无法正确显示 JSDoc 注释,但在导入文件时cjs确实es有效。

我想避免的解决方法:

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

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

标签: javascriptnpmnode-modulespackage.json

解决方案


只是不要对主文件使用扩展名,并将 es6 和 CommonJS 版本作为两个单独的文件,名称相同,位于同一目录中,但扩展名不同,所以:

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

并在package.json

{
  "main": "index"
}

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


推荐阅读