3

我正在努力将使用以下 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.jsand sha256.js,它们404(优化器清理构建的文件)和我的bar.js构建层内的人。

问题:
我对模块 amd check 有点不知所措,我怀疑它对不需要的呼叫负责。任何人都可以阐明我应该在 AMD 检查中修改什么foo以在构建层中生成可调用表单吗?

谢谢!

编辑:
我试过shimming这样:

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

它负责处理 404,但返回:

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

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

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

4

1 回答 1

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

我不知道 r.js 内部发生了什么魔法,这很有效......

于 2013-09-25T12:50:47.940 回答