如何发布写入ES6到NPM模块?如何发布写入ES6到NPM模块?(How to publish a

2019-05-12 17:51发布

我正要发布模块NPM,当我想到重写它ES6,既面向未来,并要学会ES6。 我用通天transpile到ES5,并运行测试。 但我不知道如何着手:

  1. 难道我transpile和发布生成的/ OUT文件夹到NPM?
  2. 我包括我的GitHub库的结果文件夹?
  3. 或者我保持2个回购,一个与ES6代码+一饮而尽脚本Github上,和一个与transpiled结果+试验NPM?

总之:什么步骤,我需要采取书面发布在ES6到NPM模块,同时还允许人们浏览/叉的原代码?

Answer 1:

到目前为止,我所看到的模式是保持ES6文件中src目录,并建立国家防范机制的prepublish你的东西到lib目录。

您将需要一个.npmignore文件,类似的.gitignore而忽视src而不是lib



Answer 2:

我喜欢何的答案。 我注意到几个模块采用同样的模式了。 以下是如何您可以轻松地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"]
  }
}


Answer 3:

@Jose是正确的。 这没有什么错发布ES6 / ES2015以NPM但可能引起麻烦,特别是如果你使用软件包的人正在使用的WebPack,例如,因为通常人们忽略了node_modules文件夹,同时用预处理babel出于性能的考虑。

因此,只要使用gulpgrunt或者干脆Node.js加载建立一个lib文件夹是ES5。

这是我的build-lib.js剧本,这是我保持./tools/ (无gulpgrunt在这里):

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 (据我所知)。



Answer 4:

2018年9月更新

2015年以来,当这个问题被问,对模块的JavaScript的支持显著成熟。 所有其他的答案是现在已经过时或过于复杂。 这是目前的情况和最佳实践。

支持

ES6(又名2015)的99%是通过节点支持自6版本 。 目前的nightly版本是11.所有常绿浏览器支持绝大多数的ES6功能。 ECMAScript中现在是2018版本,该版本计划现在倾向于使用多年。

ES6模块使用(与导入/导出奖金)

// 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 。

ES6模块(又名的ECMAScript模块)中的浏览器

所有常绿浏览器支持 import -ing ES6模块。 更多详情https://jakearchibald.com/2017/es-modules-in-browsers/ 。 动态的进口都支持通过Chrome和Safari。 你不再需要的WebPack /汇总/包裹等。

现在来回答这个问题。

发布ES6模块NPM,向后兼容

要发布的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直接文件。



Answer 5:

如果你想看到这个动作很简单的小的开源节点模块中,然后看看第n天 (其中我开始-还有其他的贡献者)。 看在的package.json文件,并在prepublish一步,这将导致你在哪里以及如何做到这一点。 假如克隆了一个模块,您可以在本地运行它,并把它作为你要跟一个模板。



Answer 6:

在主键package.json发布后决定的入口点的包。 所以,你可以把你的通天的输出,无论你想,只是有提到在正确的道路main键。

"main": "./lib/index.js",

下面是如何发布的NPM包一个良好的书面文章

https://codeburst.io/publish-your-own-npm-package-ff918698d450

下面是你可以借鉴的样本回购

https://github.com/flexdinesh/npm-module-boilerplate



Answer 7:

一个NPM包的两个标准是,它是没有什么比一个更有用的require( 'package' )并做一些事情软件十岁上下。

如果满足这些两个要求,你可以做你希望的任何。 即使模块是用ES6,如果最终用户并不需要知道的是,我现在transpile它以获得最大的支持。

但是,如果像兴亚 ,你的模块需要使用ES6的特性,那么也许这两个包装解决方案将是一个更好的主意用户的兼容性。

带走

  1. 只有当你需要进行发布尽可能多的代码require( 'your-package' )工作。
  2. 除非ES5和6个事宜的用户之间,只有1个发布包。 如果你一定要Transpile它。


Answer 8:

一些额外的注释为任何人,直接使用自己的模块从GitHub,不会通过已发布的模块:

该( 广泛使用的 )“prepublish”钩是不是做了你什么

一个可以做(如果计划依靠github上回购,没有公布的东西)最好的东西:

  • 不公开src从.npmignore(换句话说:允许它)。 如果你没有一个.npmignore ,请记住:副本.gitignore将用于替代安装位置,如ls node_modules/yourProject会告诉你。
  • 确保, babel-cli是你的模块中的depenency,不只是一个devDepenceny因为你确实是建立消费机上又名在应用程序开发人员的电脑,谁在使用你模块
  • 做构建的事情,在安装挂钩 ,即:

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

(在尝试任何“预安装”无添加值,即通天-CLI可能会丢失)



文章来源: How to publish a module written in ES6 to NPM?