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

时间:2017-04-25 14:12:31

标签: javascript node.js npm ecmascript-6 babeljs

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

我正在发布一个用ES6编写的npm模块,并使用babelrollup转换为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
  • node_modules

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

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

  1. 采用原始package.json
  2. 从中删除所有脚本和开发相关字段
  3. 将其复制到dist
  4. 还将文件LICENSE和README复制到dist(未触动)
  5. 整个软件包源代码将在GitHub上发布,但我不确定在npm上发布的内容

    A)整个文件结构(删除/coverage//node_modules/),顶级package.json,其中包含{的相关文件的入口点{1}}

    B)只需使用精简版dist发布dist的内容,然后阅读README&执照。我知道只是发布package.json的内容会使源地图变得毫无用处。

    这里的常见做法是什么?

2 个答案:

答案 0 :(得分:3)

我认为,最佳实践是在dist文件夹中发布缩小的代码,并在src文件夹中发布源代码。其中还应包括位于根软件包目录中的其他文件,例如package.jsonpackage-lock.jsonREADME.mdLICENSE.txtCONTRIBUTING.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}在执行distnpm version之前。

但我的建议是在Node中编写Node模块。这样,它们可以直接用于小型下载,快速安装,没有转换问题和可读错误消息 - 最后一部分在调试过程中非常重要。

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