如何在构建期间在amd兼容性检查中声明依赖关系而不创建404 /不匹配的匿名模块?

时间:2013-09-21 16:39:11

标签: javascript optimization dependencies requirejs r.js

我正在努力使用以下AMD兼容性设置为我的应用程序添加插件:

来自 foo.js 的代码段:

(function (dependencies, module) {
  "use strict";
  if (typeof define === 'function' && define.amd) {
    return define(dependencies, module);
  }
  if (typeof exports === 'object') {
    return module(exports);
  }
  window.foo = {};
  module(window.foo, {hex_sha256: hex_sha256});
}(['exports', 'sha256'], function (exports, sha256) {

 // foo

 }));

我将 foo 设置为另一个名为 bar 的模块中的依赖项,如下所示:

define(["jquery", "foo", "sha256", "c", "d"], function() {
   // stuff
});

在r.js优化器中,我将bar定义为:

  {
      name: "bar"
    , include: ["foo", "sha256", "c", "d"]
    , exclude: ["jquery"]
  },

这会生成bar.js文件,包括上述文件。

但是,当我加载构建的应用程序时,仍有两个请求被foo.jssha256.js触发,404(优化程序清理内置文件)以及谁在我的内部bar.js构建图层。

问题:
我对模块amd检查有点迷茫,并怀疑它对不必要的电话负责。任何人都可以了解我应该在AMD检查中修改的内容,以便在构建层中生成foo可调用的表单吗?

谢谢!

修改
我这样试过shimming

shim: {
  'foo':              { deps: ['sha256'] }
},

负责处理404,但返回:

Mismatched anonymous define() module: function (exports, sha256) {....

错误,所以我仍然坚持认为我的AMD检查中的sha256的硬编码依赖是罪魁祸首。也许这有帮助。

修改
我很确定我的问题源于AMD兼容性检查中的依赖声明。

1 个答案:

答案 0 :(得分:2)

以下两种解决方案需要修改foo的来源。既然你可以控制它,它们都是可行的:

  1. (快速和脏)在定义调用中对模块名称进行硬编码:

    // foo.js
    if (typeof define === 'function' && define.amd) {
        return define("foo", dependencies, module);
    }
    
  2. (清洁工)在开头查看Knockout.js的代码。我在一个项目中使用它,它似乎与r.js编译良好。我尝试了一个像你的简单的项目设置,它的工作原理;所以你必须按如下方式替换AMD兼容性代码:

    (function(factory) {
        // Support three module loading scenarios
        if (typeof require === 'function' && typeof exports === 'object' && typeof module === 'object') {
            // [1] CommonJS/Node.js
            var target = module['exports'] || exports; // module.exports is for Node.js
            var hex_sha256 = require("sha256");
            factory(target, hex_sha256);
        } else if (typeof define === 'function' && define['amd']) {
            // [2] AMD anonymous module
            define(['exports','sha256'], factory);
        } else {
            // [3] No module loader (plain <script> tag) - put directly in global namespace
            factory(window['foo'] = {}, hex_sha256);
        }
    }(function(exports, sha256){
    
        // same foo
    
    }));
    
  3. 我不知道r.js里面发生了什么神奇的事情,这有效......