使用浏览器化要求扩展的正确方法

Correct way to require extensions with browserify

本文关键字:方法 扩展 浏览器      更新时间:2023-09-26

最好的方法是包含像jQuery或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(淘汰(是全局的root,这通常是window,但是当使用浏览器化时,它是Object {}的。

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

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

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

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

这个浏览器填充码配置对我有用:

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