5

最好的方法是为 jQuery 或带有Browserify的 Knockout 等通用库添加扩展?

例如,对于类似的项目knockout-switch-case,全局ko(淘汰)变量不会传递给模块定义调用。

淘汰开关盒的 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) 是一个全局 on root,通常是这样,window但是当使用 Browserify 时它是Object {}.

我已经尝试过使用browserify-shim类似这样的示例,但它没有按预期工作(尽管它确实适用于具有更好的模块舞蹈的knockout-mapping ):

  knockout:
    path: VENDOR_PATH + '/knockout.js'
    exports: 'ko'
    depends:
      jquery: '$'

我觉得好像我必须忽略一些必须非常明显的东西,因为我希望这将是一个相当常见的模块定义模式,用于包含任何 jQuery、Knockout 或任何其他依赖于全局的库的扩展。或者也许这是一个相当特定于淘汰开关案例正在做的事情的问题。

无论如何,衷心感谢您的想法和评论。

4

1 回答 1

5

这个 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');

于 2013-11-25T01:58:15.073 回答