我正要发布模块NPM,当我想到重写它ES6,既面向未来,并要学会ES6。 我用通天transpile到ES5,并运行测试。 但我不知道如何着手:
- 难道我transpile和发布生成的/ OUT文件夹到NPM?
- 我包括我的GitHub库的结果文件夹?
- 或者我保持2个回购,一个与ES6代码+一饮而尽脚本Github上,和一个与transpiled结果+试验NPM?
总之:什么步骤,我需要采取书面发布在ES6到NPM模块,同时还允许人们浏览/叉的原代码?
我正要发布模块NPM,当我想到重写它ES6,既面向未来,并要学会ES6。 我用通天transpile到ES5,并运行测试。 但我不知道如何着手:
总之:什么步骤,我需要采取书面发布在ES6到NPM模块,同时还允许人们浏览/叉的原代码?
到目前为止,我所看到的模式是保持ES6文件中src
目录,并建立国家防范机制的prepublish你的东西到lib
目录。
您将需要一个.npmignore文件,类似的.gitignore而忽视src
而不是lib
。
我喜欢何的答案。 我注意到几个模块采用同样的模式了。 以下是如何您可以轻松地Babel6实现它。 我安装babel-cli
本地所以如果我改变我的全球巴贝尔版本的内部不破。
.npmignore
/src/
的.gitignore
/lib/
/node_modules/
安装巴贝尔
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"]
}
}
@Jose是正确的。 这没有什么错发布ES6 / ES2015以NPM但可能引起麻烦,特别是如果你使用软件包的人正在使用的WebPack,例如,因为通常人们忽略了node_modules
文件夹,同时用预处理babel
出于性能的考虑。
因此,只要使用gulp
, grunt
或者干脆Node.js加载建立一个lib
文件夹是ES5。
这是我的build-lib.js
剧本,这是我保持./tools/
(无gulp
或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));
这里有一个最后的建议:你需要一个.npmignore添加到您的项目 。 如果npm publish
没有找到这个文件,它会使用.gitignore
代替,这将导致你的麻烦,因为通常你.gitignore
文件将排除./lib
,包括./src
,这正是你想要的正好相反,当你发布到NPM。 该.npmignore
文件具有基本的语法相同.gitignore
(据我所知)。
2015年以来,当这个问题被问,对模块的JavaScript的支持显著成熟。 所有其他的答案是现在已经过时或过于复杂。 这是目前的情况和最佳实践。
ES6(又名2015)的99%是通过节点支持自6版本 。 目前的nightly版本是11.所有常绿浏览器支持绝大多数的ES6功能。 ECMAScript中现在是2018版本,该版本计划现在倾向于使用多年。
// lib.mjs
export const hello = 'Hello world!';
// index.mjs:
import { hello } from './lib';
console.log(hello);
注意强制.mjs
扩展。 为运行:
node --experimental-modules index.mjs
import
/ exports
已自节点8.5.0实验支持,以及实验标志应该走在V10 LTS 。
所有常绿浏览器支持 import
-ing ES6模块。 更多详情https://jakearchibald.com/2017/es-modules-in-browsers/ 。 动态的进口都支持通过Chrome和Safari。 你不再需要的WebPack /汇总/包裹等。
现在来回答这个问题。
要发布的ES模块npmjs.org以便它可以直接导入,没有通天或其他transpilers,简单点的main
领域在你package.json
到.mjs
文件,但省略扩展名:
{
"name": "mjs-example",
"main": "index"
}
这是唯一的变化。 通过省略扩展名,节点会先找一个MJS文件,如果有--experimental模块运行。 否则,它会回落到.js文件,所以您现有的transpilation过程支持旧版本的节点会前工作-只要确保指向通天的.mjs
文件(S)。
下面是用于使本机ES模块与向后兼容性为节点<8.5.0源我发布到NPM。 您可以立即使用它,而巴别塔或其他任何东西。
安装模块:
yarn add local-iso-dt
# or, npm install local-iso-dt
创建一个测试文件test.mjs:
import { localISOdt } from 'local-iso-dt';
console.log(localISOdt(), 'Starting job...');
运行与--experimental模块标志节点(V8.5.0 +):
node --experimental-modules test.mjs
如果您在打字稿开发,可以生成ES6代码,并使用ES6模块:
tsc index.js --target es6 --modules es2015
然后,你需要重命名*.js
输出到.mjs
,一个已知的问题 ,希望能得到固定尽快使tsc
可以输出.mjs
直接文件。
如果你想看到这个动作很简单的小的开源节点模块中,然后看看第n天 (其中我开始-还有其他的贡献者)。 看在的package.json文件,并在prepublish一步,这将导致你在哪里以及如何做到这一点。 假如克隆了一个模块,您可以在本地运行它,并把它作为你要跟一个模板。
在主键package.json
发布后决定的入口点的包。 所以,你可以把你的通天的输出,无论你想,只是有提到在正确的道路main
键。
"main": "./lib/index.js",
下面是如何发布的NPM包一个良好的书面文章
https://codeburst.io/publish-your-own-npm-package-ff918698d450
下面是你可以借鉴的样本回购
https://github.com/flexdinesh/npm-module-boilerplate
一个NPM包的两个标准是,它是没有什么比一个更有用的require( 'package' )
并做一些事情软件十岁上下。
如果满足这些两个要求,你可以做你希望的任何。 即使模块是用ES6,如果最终用户并不需要知道的是,我现在transpile它以获得最大的支持。
但是,如果像兴亚 ,你的模块需要使用ES6的特性,那么也许这两个包装解决方案将是一个更好的主意用户的兼容性。
require( 'your-package' )
工作。 该( 广泛使用的 )“prepublish”钩是不是做了你什么 。
一个可以做(如果计划依靠github上回购,没有公布的东西)最好的东西:
src
从.npmignore(换句话说:允许它)。 如果你没有一个.npmignore
,请记住:副本.gitignore
将用于替代安装位置,如ls node_modules/yourProject
会告诉你。 babel-cli
是你的模块中的depenency,不只是一个devDepenceny因为你确实是建立消费机上又名在应用程序开发人员的电脑,谁在使用你模块 做构建的事情,在安装挂钩 ,即:
"install": "babel src -d lib -s"
(在尝试任何“预安装”无添加值,即通天-CLI可能会丢失)