Javascript Require.js嵌套requires

Javascript Require.js嵌套requires,javascript,jquery,requirejs,Javascript,Jquery,Requirejs,我试图使用requireJS,但我想建立一个依赖关系层次:mainrequiresobr.platcom和obr.platcomrequiresobr(例如) 我有这样的文件层次结构: - index.html -> js - main.js -> lib - jquery.js - require.js -> obr [my own 'libraries'] - obr.js - obr.platcom.js

我试图使用requireJS,但我想建立一个依赖关系层次:
main
requires
obr.platcom
obr.platcom
requires
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>
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;
    }
});
如果我在
main
中同时需要
obr
obr.platcom
文件,则所有工作正常,但如果我使用此嵌套样式,我将收到下一个错误:

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在模块中轻松分离代码:)

    +1,但另外值得一提的是,如果DOM需要准备好,那么利用作为RequireJS一部分的domReady模块-嗯,我通常将script标记放在结束正文标记之前,所以我从不担心这个:-)。很高兴知道这个domReady模块。因为模块的加载是异步的,所以我可以使用imagi更常见的做法是在头部添加require,并需要使用domReady。我通常在头部添加require,以便更早地触发模块加载。除了不需要依赖于库之外,这还意味着模块加载可以立即开始,无论DOM是否准备就绪。模块仅在DOM准备就绪时使用。包装jQuery中的整个require调用已准备就绪。您正在减慢此过程。我觉得我应该通过测试对此进行备份,但我手头没有任何东西。@davidgnin如果您确实需要脚本加载器,那么还有很多选择。我最喜欢的是$script RequireJS确实异步加载脚本,但它的真正意图是用于AMD
    // 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;
    });