如何在 npm 包中添加文件夹作为条目?

Posted

技术标签:

【中文标题】如何在 npm 包中添加文件夹作为条目?【英文标题】:How to add a folder as entry in npm package? 【发布时间】:2019-08-28 00:31:53 【问题描述】:

我正在尝试发布一个 npm 模块。它具有以下文件夹结构。

在我的package.json 中有"main": "./dist/" 我理解index.js 的这种解决方案。但是在 dist 文件夹中,我有名为 string.jsclass.jsdom.js 的单个文件,我打算将它们导入为 import isValidZipCode from '@scope/utils/string'; 但现在我必须将它们导入为 import isValidZipCode from '@scope/utils/dist/string';

当我从node_modules 导入模块时,有什么方法可以解析文件夹吗?

编辑:主要想法是当我为单独的导出保留单独的文件时,将文件导入为import isValidZipCode from '@scope/utils/string'

【问题讨论】:

【参考方案1】:

其他答案在大多数情况下是正确的,但我认为缺少一件事(来自您的 OG 帖子或他们的答案),即:

    您的文件夹结构绝对不标准,这可能导致您当前的问题以及当您尝试查找答案时在 Google 搜索中出现无帮助的结果。 您没有显示您的package.jsonwebpack.config.js 文件内容,即使您确实有如此奇怪的文件结构,这也是回答您问题的关键。

一些建议:

    将您的文件夹结构更改为类似于

    /
    |--src
        |--utils
            |--string.js
            |--[... other js files]
            |--index.js
    |--dist (will be generated automatically)
    |--[config files, like package.json, webpack.config.js, etc]
    

    使您的 webpack.config.js 具有以下内容:

    output: 
        path: path.resolve(__dirname, 'dist'),
        //...
    
    plugins: [
        new CopyWebpackPlugin(
            patterns: [
                'ReadMe.md', // optional
                'package.json',
                'LICENSE.md' // optional
            ]
        )
    ],
    

    为了修复/规范化输出(例如,输出将是/dist/utils/[string.js, ...], /dist/package.json)。

    然后,将你的 package.json 设为 main 之类的

    "main": "utils/string.js"
    

完成此操作后,您的输出应该类似于

/
|--src
    |--utils
        |--string.js
        |--[... other js files]
        |--index.js
|--dist
    |--utils
        |--string.js
        |--[... other js files]
        |--index.js // optional: only if you want to support stuff like
                    // `import  isValidZip  from '@scope/utils';`
    |--package.json
|--[config files, like package.json, webpack.config.js, etc]

最后,你需要cd dist 并从里面运行npm publish。 (这就是为什么您需要该目录中的 package.json。)

我无法真正详细介绍 @scope 部分,因为我自己没有这样做,但我为自己的一个项目做了上述工作,并且按预期工作。

【讨论】:

【参考方案2】:

您需要做的就是在根文件夹中创建一个索引文件,然后使用以下内容导出所有文件:

在您的dist/string 中导出每个方法/函数,并为索引执行以下操作:

export * from "./dist";

因为它有助于维护代码并且看起来更干净

问候:)

【讨论】:

然后将它们导入为import isValidZipCode from '@scope/utils/string'? 抛出错误,无法解析./dist。我假设它在 dist 中寻找 index.js,而 dist 中没有。【参考方案3】:

root 文件夹中创建一个index 文件,然后像这样导出所有文件

export  default as Str  from "./dist/string";
export  default as Cls  from "./dist/class";
export  default as Dom  from "./dist/dom";

同时更新package.jsonmain./dis/ 更改为./

希望这会对您有所帮助。编码愉快。

【讨论】:

嗯是的,这可以解决问题,但您必须将它们导入为import isValidZipCode from '@scope/utils',而不是import isValidZipCode from '@scope/utils/string',对吧? @SubhenduKundu 是,如果在 utils 文件夹上创建索引文件 知道了,但我想将它们导入为'@scope/utils/string',我知道这听起来很傻,但这可能吗? @SubhenduKundu 以字符串名称创建文件夹并在其中创建索引文件。在该文件中只需导入 export default as Str from "../dist/string"; 让我们continue this discussion in chat.

以上是关于如何在 npm 包中添加文件夹作为条目?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 NPM 包中使用 webpack 动态导入?

如何将 npm 包中的 JS 文件包含到 Nuxt.js 中的单独页面

如何从 webpack 生成的 NPM 包中正确加载资产?

如何将文本作为 npm 脚本命令添加到文件中

如何从npm包中获取* .min.js文件

如何在 python 包中添加 cv2 作为要求?