我正在努力使用以下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.js
和sha256.js
触发,404
(优化程序清理内置文件)以及谁在我的内部bar.js
构建图层。
问题:
我对模块amd检查有点迷茫,并怀疑它对不必要的电话负责。任何人都可以了解我应该在AMD检查中修改的内容,以便在构建层中生成foo
可调用的表单吗?
谢谢!
修改
我这样试过shimming
:
shim: {
'foo': { deps: ['sha256'] }
},
负责处理404,但返回:
Mismatched anonymous define() module: function (exports, sha256) {....
错误,所以我仍然坚持认为我的AMD检查中的sha256
的硬编码依赖是罪魁祸首。也许这有帮助。
修改:
我很确定我的问题源于AMD兼容性检查中的依赖声明。
答案 0 :(得分:2)
以下两种解决方案需要修改foo
的来源。既然你可以控制它,它们都是可行的:
(快速和脏)在定义调用中对模块名称进行硬编码:
// foo.js
if (typeof define === 'function' && define.amd) {
return define("foo", dependencies, module);
}
(清洁工)在开头查看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里面发生了什么神奇的事情,这有效......