javascript 我应该在npm上发布我的模块的源代码吗?

ymdaylpp  于 2023-02-11  发布在  Java
关注(0)|答案(3)|浏览(137)

我希望这个问题不会太固执己见,我问的是最佳/常见的做法。
我正在发布一个用ES6编写的npm模块,并使用babelrollup将其转换为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变得无用。

这里的惯例是什么?

ukdjmx9f

ukdjmx9f1#

在我看来,最好的做法是在dist文件夹中发布缩小的代码,也在src文件夹中发布源代码。还应该包括其他文件,如package.jsonpackage-lock.jsonREADME.mdLICENSE.txtCONTRIBUTING.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以供公共使用。

mf98qq94

mf98qq942#

通常的做法是在npm上有一个源代码,而不是蒸发/缩小/等的结果。发布最初不需要任何蒸发的模块也很常见。
如果您的模块不能直接在Node中使用而不需要转换(这对于npm上的模块来说是非常不寻常的,当然也是不期望的),那么您要么必须确保在安装过程中转换它(这很棘手,如果做错了,可能会损坏用户的文件系统),要么在您发布的模块中包含dist
如果你打算在发布的模块中包含dist,那么你需要确保当人们需要你的模块时加载了正确的文件,并且你总是在构建npm versionnpm publish之前构建一个新的dist
不过我的建议是用Node编写Node模块,这样就可以直接使用它们,只需少量下载,快速安装,没有任何问题,并且错误信息可读--最后一部分在调试过程中非常重要。
发布翻译后的代码有一个严重的问题经常被忽视。发布的代码在任何方面都不同于实际的源代码,无论它是翻译的,缩小的还是模糊的,都有一些安全隐患。审计翻译结果是非常困难的,如果这是实际运行的代码,你必须这样做(特别是如果你自己没有翻译它)。

wwodge7n

wwodge7n3#

好吧,我认为包应该只有dist文件夹,package.json和自述文件(如果必要的话,可能是一些配置文件和bin中的脚本)。
不包含源文件的原因是,如果有人想查看源代码,他们可以在源代码库中看到它,在package.json的repository部分提到。为什么要用源代码污染目标包?npm包的目的是一种“binary/exec/minimized”版本的库,而不是源代码,这样可以保存用户的存储空间。

相关问题