【问题标题】:Load several configuration files with RequireJS使用 RequireJS 加载几个配置文件
【发布时间】:2015-09-27 13:31:20
【问题描述】:

我是 RequireJs 库的新手,所以我有一个问题。在我的应用程序中,我有一个本地化文件(称为en.jses.js 等)和一个设置文件(settings.js)。第一个用于本地化我的应用程序(更改消息、标题等),第二个用于在应用程序上设置一些配置。所以,我想要的是在加载主应用程序文件之前加载本地化文件(比如en.js)和settings.js 文件。这里是文件树结构:

\static
    \js
        \locale
           en.js
        \config
           settings.js
        \app
           app.js

在教程中,我只看到data-main 指定的一个入口点,例如:

<script data-main="scripts/main" src="scripts/require.js"></script>

但在我的情况下,似乎应该首先加载两个主要文件(en.jssettings.js)。那么,实现这一点的正确方法是什么?

编辑

对于那些不熟悉模块化 JavaScript 的人,我建议阅读 this 文章。在找到这篇文章之前,我花了很多时间试图理解文档和几十个教程。而且我认为,它是模块化 JavaScript 新手的最佳信息来源。

【问题讨论】:

    标签: javascript requirejs


    【解决方案1】:

    在启动应用程序之前加载两个配置的最直接方法是不使用 RequireJS 加载此配置,而是使用 script 元素加载它。你可以:

    <script src="scripts/require.js"></script>
    <script src="path/to/settings.js"></script>
    <script src="path/to/en.js"></script>
    <script>
        require(["name of your main module"]);
    </script>
    

    en.jssettings.js 的路径是普通的旧 JavaScript 路径。 "name of your main module" 取决于您的 RequireJS 配置中的内容,您没有在问题中显示。我宁愿不假设。鉴于settings.js 是您的应用程序的通用 配置。我把它放在首位,以便en.js 可以从中受益,并且只包含最少量的代码。所以你的settings.js 将包含一般配置选项,这通常意味着至少设置baseUrl,很可能还有paths

    requirejs.config({
        baseUrl: "static/js",
        paths: {
            // whatever makes sense for your application
        }
    });
    

    您的en.js 文件也可以根据需要调用requirejs.config。您需要什么取决于您使用的国际化解决方案。您的 app.js 将类似于:

    define([ ... deps ... ], function (... arguments ... ) {
        // start the application
    });
    

    deps 所需的内容取决于您的应用程序实际使用的内容。你不需要那里的en.jssettings.js,因为它们已经被加载了。

    这样你就不需要嵌套任何东西。

    【讨论】:

    • 如果是这样,为什么还要使用require.js 而不仅仅是用普通的旧script 加载app.js?
    • RequireJS 用于加载其他所有内容。只是不是它自己的配置。在最简单的情况下,让 RequireJS 加载它自己的配置是可以的,但是一旦你开始增加配置,你就是在自找麻烦。
    • 哦,我明白你的意思了,但我不打算加载自己的配置,我打算加载应用程序配置和本地化文件。 settings.jsen.jsapp.js 均不包含任何 requirejs 代码。
    • 什么? settings.jsen.js不是都包含对requirejs.config的调用吗?而 app.js 是调用define 的 AMD 模块?否则,你应该问自己“为什么使用RequireJS?”
    • 我已经编辑了答案。这与我所能做到的一样精确。具体需要做什么取决于您的应用程序的具体情况。
    【解决方案2】:

    如果您的模块 app.js 需要 en.js 和 settings.js 才能工作,这里是您的 main.js 的可能结构

    ma​​in.js

    requirejs.config({
        baseUrl: "/static/js",
        paths: {
            en: "locale/en",
            settings: "config/settings",
            app: "app/app"
        }
    });
    
    
    requirejs(["en", "settings"], function(enRes, settingsRes) {
    
        //here you're sure that both modules are loaded
    
        // you can load app module
        requirejs(["app"], function(appRes) {
          //start your app
        });
    
    });
    

    【讨论】:

    • 我觉得它很有用。谢谢!
    • @Louis,这有什么问题?我还没有接受它,所以你可以分享你自己的解决方案
    • @Jacobian 它未被接受,但已被赞成。此答案将导致间歇性故障。 (哦,mainConfigFile 不是运行时选项。它是优化器选项。)
    • 它被投了赞成票,因为当人们试图提供帮助时,我不喜欢劝阻他们。
    • @Pierfrancesco 好的,我对ensettings 之间的顺序不确定性不满意,但是...嗯...如果是真的 真的小心,他们可能会得到一些有用的东西。我不会在我自己的项目中这样做,因为我知道如果我设置了需要我在数周、数月和数年后非常小心的事情会发生什么:我忘记了我必须在蛋壳上行走。
    最近更新 更多