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

Leo*_*rdo 13 javascript node.js npm ecmascript-6 babeljs

我希望这个问题不会过于自以为是,我要问的是最佳/普遍的做法.

我正在发布一个用ES6编写的npm模块,并使用babel汇总转换为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
Run Code Online (Sandbox Code Playgroud)

源代码在其中/src/,编译代码在/dist/.
这些目录是.gitignored:

  • 覆盖
  • DIST
  • node_modules

用户真正使用的确是内容/dist/.

我一直在使用带有构建过程的入门套件:

  1. 拿原件 package.json
  2. 从中删除所有脚本和dev相关字段
  3. 把它复制到dist
  4. 还将文件LICENSE和README复制到dist(未触及)

整个包源将在GitHub上发布,但我不确定在npm上发布什么:

A)整个文件结构(删除/coverage//node_modules/),顶层package.json具有相关文件的入口点dist

要么

B)只发布dist精简内容package.json和README&LICENSE.我知道只是发布内容/dist会使源地图无效.

这里的常见做法是什么?

Jyo*_*Pal 11

在我看来,最好的做法是在dist文件夹中发布缩小的代码以及在文件夹中发布源代码src。人们还应该包括其他文件,例如package.jsonpackage-lock.jsonREADME.mdLICENSE.txtCONTRIBUTING.md,等,这是在根目录包。

为了实现这一点,应该使用files属性 inpackage.json将需要发布的内容列入白名单,npm而不是通过将 in 列入黑名单来查找不需要发布的内容.npmignore

dist文件夹应该只有缩小的包,不需要package.json通过删除脚本devDependencies等在 dist 文件夹中生成另一个。

这是因为当包的使用者 do 时npm install <package name>,它只安装里面的包dependencies而忽略devDependecies.

浏览器可以通过直接从脚本标签引用来使用缩小的文件,其中由于文件大小小,加载时间会更短,而现代框架(例如angular将使用未缩小的代码)。现代框架有自己的构建工具,比如webpack/rollup可以创建一个缩小的包文件。

有没有需要有一个顶层package.json已在切入点main领域中的相关文件dist。相反,在我看来,顶级package.json应该有相关文件的入口点,例如index.js在相同的根包级别。

最后,您可以运行npm pack以查看 tarball 中的内容,然后最后npm publish从根包文件夹中对 npm 注册表进行公共使用。

  • 有人知道 2021 年发布 npm 包的好入门者吗? (3认同)

rsp*_*rsp 0

常见的做法是在 npm 上拥有源代码,而不是转译/压缩等的结果。发布一开始就不需要任何转译的模块也很常见。

如果你的模块不能在没有转译的情况下直接在 Node 中使用(这对于 npm 上的模块来说是非常不寻常的,当然不是预期的),那么你要么必须确保它在安装过程中被转译(这很棘手,并且可能会损坏用户的文件系统)如果做错了)或将其包含dist在您发布的模块中。

如果您打算将 包含dist在已发布的模块中,那么您需要确保当人们需要您的模块时加载正确的文件,并且您始终在dist执行npm version和之前构建一个新的文件npm publish

不过,我的建议是在 Node.js 中编写 Node 模块。这样,它们就可以直接使用,下载量小,安装速度快,没​​有转译问题,并且错误消息可读 - 最后一部分在调试过程中非常重要。

发布转译代码有一个经常被忽视的严重问题。发布与实际源代码有任何不同的代码,无论是以任何方式进行转译、缩小或混淆,都会产生一些安全隐患。审核转译结果非常困难,如果这是实际运行的代码(特别是如果您没有自己转译它),则必须这样做。

  • @CodingIntrigue我会这样说:当我对你的模块进行安全审计时,如果该结果分布在npm上,我必须审计结果而不是转译源,因为有人可以手动在转译结果中放置后门转译后。源映射在这里无关紧要。如果您在转译之前分发代码并在安装期间进行转译,则不存在此问题,但会出现其他问题,如我在答案中所述。不管怎样,都会有问题,这就是为什么我建议避免它们。 (4认同)
  • 不确定这一点。Babel的创建者[建议部署](https://github.com/babel/babel/issues/2246#issuecomment-134420731)转译代码 (3认同)