Chrome 扩展中的 UMD 模块
UMD modules in a Chrome Extension
UMD模块定义大概是这样的:
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['exports', 'b'], factory);
} else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
// CommonJS
factory(exports, require('b'));
} else {
// Browser globals
factory((root.commonJsStrict = {}), root.b);
}
}(this, function (exports, b) {
//use b in some fashion.
// attach properties to the exports object to define
// the exported module properties.
exports.action = function () {};
}));
问题是 Chrome 扩展不支持任何这些导出模块的方法:
define
不存在
exports
不存在
this
未绑定到 window
因此,UMD 模块似乎在 Chrome 扩展环境中失败。是否有任何解决方法可以使 UMD 模块正确导出到 Chrome 扩展中的 window
对象?
正如@wOxxOm 正确指出的那样,Chrome 扩展环境与浏览器相同,this
确实绑定到 window
,因此 UMD 模块可以而且应该使用扩展程序。
事实证明,实际问题是 babel 正在生成一个包,其中 this
替换为 undefined
,这是本期概述和解决的问题:。
UMD模块定义大概是这样的:
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['exports', 'b'], factory);
} else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
// CommonJS
factory(exports, require('b'));
} else {
// Browser globals
factory((root.commonJsStrict = {}), root.b);
}
}(this, function (exports, b) {
//use b in some fashion.
// attach properties to the exports object to define
// the exported module properties.
exports.action = function () {};
}));
问题是 Chrome 扩展不支持任何这些导出模块的方法:
define
不存在exports
不存在this
未绑定到window
因此,UMD 模块似乎在 Chrome 扩展环境中失败。是否有任何解决方法可以使 UMD 模块正确导出到 Chrome 扩展中的 window
对象?
正如@wOxxOm 正确指出的那样,Chrome 扩展环境与浏览器相同,this
确实绑定到 window
,因此 UMD 模块可以而且应该使用扩展程序。
事实证明,实际问题是 babel 正在生成一个包,其中 this
替换为 undefined
,这是本期概述和解决的问题: