[英]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-lib
的package.json
包括:
{
"name": "my-es6-crypto-lib",
"main": "transpiled-to-commonjs/node.js",
"module": "es6-module/node.js",
"browser": "es6-module/browser.js",
...
}
main
键来解析CommonJS模块。 module
密钥。 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库可以做到这一点?
理想的情况是:
过了一段时间,我现在认为最好的方法是为每个环境导出不同的功能。
过去,复杂的JavaScript库使用了像Browserify这样的解决方案来捆绑浏览器的应用程序版本。 大多数这些解决方案的工作原理是允许库开发人员广泛配置和手动覆盖各个浏览器版本的各种依赖项。
例如,在Node.js应用程序可能使用Node.js的内置加密模块的情况下,浏览器版本需要回退到类似polyfill的替代依赖项,如crypto-browserify。
使用es6,不再需要此自定义和配置。 您的库现在可以为不同的消费者导出不同的功能。 虽然浏览器使用者可以导入库导出的本机JavaScript加密实现,但Node.js用户可以选择导入库导出的不同,更快的实现。
...
这是详细解释,并举例说明,在typescript-starter自述文件→
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.