如何将用ES6编写的模块发布到NPM?
我正准备发布一个模块给NPM,当时我想到在ES6中重写它,同时面向未来,学习ES6。 我使用Babel来转换到ES5,并运行testing。 但我不知道如何继续:
- 我是否要编译并将结果/输出文件夹发布到NPM?
- 包含结果文件夹在我的Github回购?
- 还是我维护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
文件夹。
所以,只需使用gulp
, grunt
或简单的Node.js来构build一个ES5的lib
文件夹即可。
这里是我的build-lib.js
脚本,我保留在./tools/
(这里没有一点grunt
或grunt
):
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将是一个更好的主意。
带走
- 只需要发布尽可能多的代码就可以使你的需求
require( 'your-package' )
工作。 - 除非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可能会丢失)