繁体   English   中英

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

[英]Emit a Javascript library as an ES6 module with different browser and Node.js implementations

创建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)

my-es6-crypto-libpackage.json包括:

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

Node.js的实际实现类似于:( 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方法都有相同的参数message并返回一个字符串。

构建我的ES6模块以提供每个实现的最佳方法是什么? 那里有没有javascript库可以做到这一点?

理想的情况是:

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

(我还为Rollup打开了一个GitHub问题→

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

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

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

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

...

这是详细解释,并举例说明,在typescript-starter自述文件→

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM