如何将用ES6编写的模块发布到NPM?

我正准备发布一个模块给NPM,当时我想到在ES6中重写它,同时面向未来,学习ES6。 我使用Babel来转换到ES5,并运行testing。 但我不知道如何继续:

  1. 我是否要编译并将结果/输出文件夹发布到NPM?
  2. 包含结果文件夹在我的Github回购?
  3. 还是我维护2个仓库,一个是Github的ES6代码+ gulp脚本,另一个是经过转换的结果+ NPMtesting?

简而言之:我需要采取什么步骤将ES6中编写的模块发布到NPM,同时还允许用户浏览/分离原始代码?

我目前看到的模式是将es6文件保存在src目录中,并在npm的预发布到lib目录中构build你的东西​​。

您将需要.npmignore文件,类似于.gitignore,但忽略src而不是lib

我喜欢José的回答。 我已经注意到几个模块已经遵循这个模式。 以下是如何使用Babel6轻松实现它的方法。 我在本地安装babel-cli ,所以如果我改变我的全球babel版本,构build不会中断。

.npmignore

 /src/ 

的.gitignore

 /lib/ /node_modules/ 

安装Babel

 npm install --save-dev babel-core babel-cli babel-preset-es2015 

的package.json

 { "main": "lib/index.js", "scripts": { "prepublish": "node_modules/babel-cli/bin/babel.js src --out-dir lib" }, "babel": { "presets": ["es2015"] } } 

@乔斯是对的。 将ES6 / ES2015发布到NPM是没有问题的,但是这可能会造成麻烦,特别是如果使用软件包的人使用Webpack,例如,由于性能原因,使用babel进行预处理时,通常人们会忽略node_modules文件夹。

所以,只需使用gulpgrunt或简单的Node.js来构build一个ES5的lib文件夹即可。

这里是我的build-lib.js脚本,我保留在./tools/ (这里没有一点gruntgrunt ):

 var rimraf = require('rimraf-promise'); var colors = require('colors'); var exec = require('child-process-promise').exec; console.log('building lib'.green); rimraf('./lib') .then(function (error) { let babelCli = 'babel --optional es7.objectRestSpread ./src --out-dir ./lib'; return exec(babelCli).fail(function (error) { console.log(colors.red(error)) }); }).then(() => console.log('lib built'.green)); 

这是最后的build议:你需要添加一个.npmignore到你的项目 。 如果npm publish没有find这个文件,它会使用.gitignore来代替,这会给你带来麻烦,因为通常你的.gitignore文件将会排除./lib并且包含./src ,这与你想要的完全相反正在向NPM发布。 .npmignore文件具有与.gitignore (AFAIK)基本相同的语法。

如果你想在一个非常简单的小型开源Node模块中看到这一点,那么看看第n天 (我开始 – 也是其他贡献者)。 查看package.json文件,并在preublish步骤,这将导致您在哪里以及如何做到这一点。 如果你克隆这个模块,你可以在本地运行它,并将它用作你的模板。

NPM软件包的两个标准是它只能用于一个require( 'package' )并做一些软件。

如果你满足这两个要求,你可以做任何你想要的。 即使这个模块是用ES6编写的,如果最终用户不需要知道这个,我现在就可以进行传输,以获得最大的支持。

但是,如果像koa ,你的模块需要与使用ES6function的用户兼容,那么也许这两个包解决scheme将是一个更好的主意。

带走

  1. 只需要发布尽可能多的代码就可以使你的需求require( 'your-package' )工作。
  2. 除非ES5&6之间对用户有意义,否则只发布1个包。 如果你有必要的话,把它转交给你。

一些额外的笔记给任何人,直接从github使用自己的模块,不通过发布的模块:

( 广泛使用的 )“预发布”挂钩对你没有任何帮助。

最好的事情可以做(如果计划依靠github回购,而不是发布的东西):

  • 从.npmignore取消src (换句话说:允许)。 如果您没有.npmignore ,请记住:将在安装的位置使用.gitignore的副本,因为ls node_modules/yourProject会显示您。
  • 确保babel-cli是你的模块中的一个依赖,而不仅仅是一个devDepenceny,因为你确实正在使用你的模块的App开发人员计算机
  • 做安装的东西,在安装钩,即:

    "install": "babel src -d lib -s"

(在尝试任何“预安装”时没有附加值,即babel-cli可能会丢失)