创建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
{
"name": "my-es6-crypto-lib",
"main": "transpiled-to-commonjs/node.js",
"module": "es6-module/node.js",
"browser": "es6-module/browser.js",
...
}
键来解析CommonJS模块。main
键。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库可以执行此操作?
理想情况下:
答案 0 :(得分:0)
过了一段时间,我现在认为最好的方法是为每个环境导出不同的功能。
中深入解释并举例说明过去,复杂的JavaScript库使用了像Browserify这样的解决方案来捆绑浏览器的应用程序版本。大多数这些解决方案的工作原理是允许库开发人员使用各自的浏览器版本进行广泛配置和手动覆盖各种依赖关系。
例如,Node.js应用程序可能使用Node.js的内置加密模块,浏览器版本需要回退到类似polyfill的替代依赖项,如crypto-browserify。
使用es6,不再需要此自定义和配置。您的库现在可以为不同的消费者导出不同的功能。虽然浏览器使用者可以导入库导出的本机JavaScript加密实现,但Node.js用户可以选择导入库导出的不同,更快的实现。
...