将Javascript库作为具有不同浏览器和Node.js实现的ES6模块发出

时间:2017-02-21 02:20:05

标签: javascript node.js typescript ecmascript-6 browserify

创建ES6库的最佳方法是什么,例如my-es6-crypto-lib,可以在浏览器和Node.js中使用,但每个平台上的实现都不同?

(例如,Node.js实现使用内置的crypto模块来提高性能。)

ES6模块用法:

import { sha256 } from 'my-es6-crypto-lib'
let digest = sha256('abc')
console.log(digest)

或Node.js样式需要:

let sha256 = require('my-es6-crypto-lib')
let digest = sha256('abc')
console.log(digest)

package.json的{​​{1}}包括:

my-es6-crypto-lib
  • Node.js将遵循{ "name": "my-es6-crypto-lib", "main": "transpiled-to-commonjs/node.js", "module": "es6-module/node.js", "browser": "es6-module/browser.js", ... } 键来解析CommonJS模块。
  • 能够使用ES6模块的工具(如转发器/捆绑工具)遵循main键。
  • 使用ES6模块并将其捆绑给浏览器的工具(例如rollup-plugin-node-resolve)将使用module键。

Node.js的实际实现类似于:(browser

transpiled-to-commonjs/node.js

虽然浏览器实现类似于:(// built-in module, faster than the pure Javascript implementation let createHash = require('crypto') export function sha256 (message) { return createHash('sha256').update(message).digest('hex') }

es6-module/browser.js

请注意,每个平台上每个函数的实现都不同,但两个// a javascript-only implementation available at es6-module/hashFunctions.js import { sha256 } from './hashFunctions' export function sha256 (message) { // slightly different API than the native module return sha256(message, 'hex') } 方法都具有相同的参数sha256并返回一个字符串。

构建我的ES6模块以提供每个实现的最佳方法是什么?是否有任何javascript库可以执行此操作?

理想情况下:

  • 未使用的实现应该能够树摇动,并且
  • 不应使用运行时检查来确定当前环境。

(我还开了一个GitHub issue for Rollup →

1 个答案:

答案 0 :(得分:0)

过了一段时间,我现在认为最好的方法是为每个环境导出不同的功能。

  

过去,复杂的JavaScript库使用了像Browserify这样的解决方案来捆绑浏览器的应用程序版本。大多数这些解决方案的工作原理是允许库开发人员使用各自的浏览器版本进行广泛配置和手动覆盖各种依赖关系。

     

例如,Node.js应用程序可能使用Node.js的内置加密模块,浏览器版本需要回退到类似polyfill的替代依赖项,如crypto-browserify。

     

使用es6,不再需要此自定义和配置。您的库现在可以为不同的消费者导出不同的功能。虽然浏览器使用者可以导入库导出的本机JavaScript加密实现,但Node.js用户可以选择导入库导出的不同,更快的实现。

     

...

typescript-starter readme →

中深入解释并举例说明