我正在尝试使用requireJS,但我想构建依赖关系的层次结构:main
需要obr.platcom
,而obr.platcom
需要obr
(例如)。
我有这个文件层次结构:
- index.html
-> js
- main.js
-> lib
- jquery.js
- require.js
-> obr [my own 'libraries']
- obr.js
- obr.platcom.js
index.html
<!DOCTYPE html>
<html lang="es">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="initial-scale=1.0, width=device-width" />
<title>Platcom</title>
<script type="text/javascript" src="js/lib/jquery.js"></script>
<script data-main="js/main" src="js/lib/require.js"></script>
</head>
<body>
</body>
</html>
main.js
$(document).ready(function() {
require(["obr/obr.platcom"], function() {
obr.hola();
var myPlatcom = obr.platcom();
myPlatcom.test();
});
});
obr.js
var obr = {};
obr.hola = function() {
alert('Hola OBR');
};
obr.platcom.js
require(["obr.js"],function() {
obr.platcom = function(params) {
var that = {};
var test = function test() {
alert('Hola Platcom!');
}
that.test = test;
return that;
}
});
如果我同时要求
obr
中的obr.platcom
和main
文件都可以,但是如果我使用这种嵌套样式,则会收到下一个错误:Uncaught ReferenceError: obr is not defined main.js:3
你知道我在做什么错吗?
先感谢您。
最佳答案
好吧,您做错了几件事。
require(["obr/obr.platcom"], function() {
不会做很多事情。您应该需要这样:require(["obr/obr.platcom"], function( obr ) {
这样,您就知道所需对象位于哪个变量中。
obr.js
变量在全局范围内。您需要将它们包装在require
或define
函数调用中。以下将起作用:define(function() {
var obr = {};
obr.hola = function() {};
return obr;
});
您可能已经注意到上一个文件有一些错误。
define
函数,而不是require
函数。并且define
函数必须返回一个对象。这是一个固定的obr.platcom.js
文件:// If you don't use "define" for the obr.js file too, this won't work
define(['obr'], function( obr ) {
obr.platcom = function() {};
// Don't forget to return the obr object, or the require of
// the main file won't return anything
return obr;
});
这样,事情就以正确的方式完成。或者至少,require.js希望您做的事情。
我希望这能告诉您如何有效地使用require.js轻松地将模块中的代码分开:)