我希望这个问题不会太固执己见,我问的是最佳/常见的做法。
我正在发布一个用ES6编写的npm模块,并使用babel和rollup将其转换为ES 5和UMD。
文件结构可以总结如下:
/coverage/
/dist/
/node_modules/
/src/
/test/
/tools/
.editorconfig
.eslintrc
.gitattributes
.gitignore
.travis.yml
CHANGELOG.md
CONTRIBUTING.md
LICENSE.txt
package.json
README.md
源代码在/src/
中,编译代码在/dist/
中。
忽略这些目录:
- 覆盖率
- 距离
- 节点模块
用户真正使用的是/dist/
的内容。
我一直在使用一个初学者工具包,其构建过程如下:
1.取原始的package.json
1.从中删除所有脚本和与dev相关的字段
1.复制到dist
1.还将文件LICENSE和README复制到dist(未修改)
整个包源代码将在GitHub上发布,但我不确定在npm上发布什么:
**A)**整个文件结构(删除/coverage/
和/node_modules/
),顶层package.json
具有dist
中相关文件的入口点
或
**B)**只发布dist
的内容,附带一个精简的package.json
和README & LICENSE。我知道只发布/dist
的内容会使源代码Map变得无用。
这里的惯例是什么?
3条答案
按热度按时间ukdjmx9f1#
在我看来,最好的做法是在
dist
文件夹中发布缩小的代码,也在src
文件夹中发布源代码。还应该包括其他文件,如package.json
,package-lock.json
,README.md
,LICENSE.txt
,CONTRIBUTING.md
等,这些文件位于根包目录下。要实现这一点,应该使用
package.json
中的**files
属性将需要发布到npm
的内容列入白名单,而不是通过在.npmignore
中列入黑名单来查找不需要发布的内容。dist
文件夹应仅包含缩小的捆绑包,无需通过删除脚本、devDependencies
等在dist文件夹中生成另一个package.json
。这是因为当包的消费者执行
npm install <package name>
时,它只安装dependencies
内的包,而忽略devDependecies
下的包。浏览器可以直接从scripts标签中引用缩小的文件,由于文件大小较小,加载时间会更短,而现代框架如
angular
将使用未缩小的代码。现代框架有自己的构建工具,如webpack
/rollup
,它们创建一个缩小的捆绑文件。没有必要在
main
字段中有一个到dist
中相关文件的入口点的顶层package.json
,相反,在我看来,顶层package.json
应该有一个到相同根包级别的相关文件(如index.js
)的入口点。最后,可以运行
npm pack
**来查看tarball中有什么,然后最后从根包文件夹中对npm注册表执行npm publish
以供公共使用。mf98qq942#
通常的做法是在npm上有一个源代码,而不是蒸发/缩小/等的结果。发布最初不需要任何蒸发的模块也很常见。
如果您的模块不能直接在Node中使用而不需要转换(这对于npm上的模块来说是非常不寻常的,当然也是不期望的),那么您要么必须确保在安装过程中转换它(这很棘手,如果做错了,可能会损坏用户的文件系统),要么在您发布的模块中包含
dist
。如果你打算在发布的模块中包含
dist
,那么你需要确保当人们需要你的模块时加载了正确的文件,并且你总是在构建npm version
和npm publish
之前构建一个新的dist
。不过我的建议是用Node编写Node模块,这样就可以直接使用它们,只需少量下载,快速安装,没有任何问题,并且错误信息可读--最后一部分在调试过程中非常重要。
发布翻译后的代码有一个严重的问题经常被忽视。发布的代码在任何方面都不同于实际的源代码,无论它是翻译的,缩小的还是模糊的,都有一些安全隐患。审计翻译结果是非常困难的,如果这是实际运行的代码,你必须这样做(特别是如果你自己没有翻译它)。
wwodge7n3#
好吧,我认为包应该只有dist文件夹,package.json和自述文件(如果必要的话,可能是一些配置文件和bin中的脚本)。
不包含源文件的原因是,如果有人想查看源代码,他们可以在源代码库中看到它,在package.json的repository部分提到。为什么要用源代码污染目标包?npm包的目的是一种“binary/exec/minimized”版本的库,而不是源代码,这样可以保存用户的存储空间。