最好的方法是使用 Browserify 为 jQuery 或 Knockout 等公共(public)库添加扩展。 ?
例如,像 knockout-switch-case
这样的项目, 全局 ko
(knockout) 变量不会传递给模块定义调用。
knockout-switch-case 的 AMD 代码是:
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['knockout'], factory);
} else {
// Browser globals
factory(root.ko);
}
}(this, function(ko) {
它期望 ko
( knockout )是 root
上的全局变量,通常是 window
但在使用 Browserify 时它是 对象{}
。
我已经尝试过使用 browserify-shim
的示例用这样的东西,但它没有按预期工作(尽管它确实适用于 knockout-mapping ,它有更好的模块舞蹈):
knockout:
path: VENDOR_PATH + '/knockout.js'
exports: 'ko'
depends:
jquery: '$'
我觉得好像我必须忽略一些非常明显的东西,因为我希望这将是一个相当常见的模块定义模式,用于包含任何 jQuery、Knockout 或依赖于全局的库的任何其他扩展。或者这可能是一个相当特定于 knockout-switch-case 正在做的事情的问题。
无论如何,我们真诚地感谢您的想法和评论。
最佳答案
这个 browserify-shim 配置对我有用:
shim(browserify(), {
jquery: {
path: './js/vendor/jquery.js',
exports: '$'
},
'knockout': {
path: './js/vendor/knockout.js',
exports: 'ko',
depends: {
jquery: '$'
}
},
'knockout-switch-case': {
path: './js/vendor/knockout-switch-case.js',
exports: null,
depends: {
knockout: 'ko'
}
}
})
这样,您就可以像往常一样要求:var ko = require('knockout');
关于javascript - 使用 browserify 要求扩展的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19781086/