我希望这个问题不会太过自以为是,我会问这个问题的最佳/普遍做法。
我正在发布一个用ES6编写的npm模块,并使用babel和rollup转换为ES5和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/
内
这些目录是.gitignored:
用户真正使用的确是/dist/
的内容。
我一直在使用带有构建过程的入门套件:
package.json
整个软件包源代码将在GitHub上发布,但我不确定在npm上发布的内容:
A)整个文件结构(删除/coverage/
和/node_modules/
),顶级package.json
,其中包含{的相关文件的入口点{1}}
或
B)只需使用精简版dist
发布dist
的内容,然后阅读README&执照。我知道只是发布package.json
的内容会使源地图变得毫无用处。
这里的常见做法是什么?
答案 0 :(得分:3)
我认为,最佳实践是在dist
文件夹中发布缩小的代码,并在src
文件夹中发布源代码。其中还应包括位于根软件包目录中的其他文件,例如package.json
,package-lock.json
,README.md
,LICENSE.txt
,CONTRIBUTING.md
等。为此,应使用files
中的package.json
字段将需要发布到npm
的内容列入白名单,而不是通过在.npmignore
中将其列入黑名单来查找不需要发布的内容。 dist
文件夹应该只有最小的捆绑包,不需要通过删除脚本package.json
等在dist文件夹中生成另一个devDependencies
。这是因为当包的使用者使用{{1} },它将仅安装npm install <package name>
内的软件包,而忽略dependencies
下的软件包。
缩小的文件可以由浏览器使用,方法是直接从scripts标记引用,由于文件较小,因此加载时间会缩短,而devDependecies
等现代框架将使用未缩小的代码。现代框架拥有自己的构建工具,喜欢angular
来减少代码。
没有必要在webpack
字段中具有指向package.json
中相关文件的入口的顶级main
。我认为,相反,顶层dist
应该在相同的根软件包级别具有指向相关文件(例如package.json
)的入口点。
最后,可以运行index.js
来查看压缩包中的内容,然后最后从根软件包文件夹中npm pack
对npm注册表进行公开使用。
答案 1 :(得分:0)
通常的做法是在npm上有一个源代码,而不是transmentation / minification / etc的结果。发布不需要任何转换的模块也很常见。
如果您的模块无法在没有转换的情况下直接在Node中使用(这对于npm上的模块来说非常不寻常,当然不是预期的那样)那么您必须确保在安装期间将其转换(这很棘手并且可能会损坏)用户的文件系统如果做错了)或在您发布的模块中包含dist
。
如果您要在已发布的模块中包含dist
,那么您需要确保在人们需要您的模块时加载了正确的文件,并且您始终构建一个新的{{1}在执行dist
和npm version
之前。
但我的建议是在Node中编写Node模块。这样,它们可以直接用于小型下载,快速安装,没有转换问题和可读错误消息 - 最后一部分在调试过程中非常重要。
发布经常被忽视的转换代码存在一个严重问题。发布与实际源代码不同的代码,无论是以任何方式进行转换,缩小或混淆,都会产生一些安全隐患。审核转换结果非常困难,如果那是实际运行的代码,你必须这样做(特别是如果你没有自己编译)。