使用browserify要求扩展的正确方法

时间:2013-11-05 02:45:02

标签: javascript jquery knockout.js browserify

最好的方法是使用Browserify包含jQuery或Knockout等公共库的扩展名?

例如,对于像knockout-switch-case这样的项目,全局ko(基质)变量不会传递给模块定义调用。

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(淘汰赛)成为全球root,通常为window,但使用Browserify时Object {}

我已尝试使用browserify-shim这样的示例,但它没有按预期工作(虽然它适用于knockout-mapping,它有更好的模块舞蹈:

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

我觉得我必须忽略一些必须非常明显的东西,因为我希望这将是一个相当常见的模块定义模式,包括任何jQuery,Knockout或依赖于全局的库的任何其他扩展。或者这可能是 knockout-switch-case 正在做的事情。

无论如何,我们真诚地感谢您的想法和评论。

1 个答案:

答案 0 :(得分: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');