【问题标题】:Ensure requireJS conditional module loaded确保加载了 requireJS 条件模块
【发布时间】:2012-10-06 21:18:51
【问题描述】:

我正在尝试在现有项目中使用 requireJS。我有一个 App 模块,其中包含有关当前语言环境、url 的信息……如果当前语言环境很特殊,我想加载另一个模块:

// App.js
define([], function() {
    return {
        setEnv: function(obj) { //obj: {locale:'en'}
            this.env = obj;
            that = this;
            if( this.env.locale == 'fa' )
                require(['locale/fa'], function(fa) {
                    that.number = fa.number
                };
            else
                this.number = function( n ) { return n+'' }
        }
    }
});

语言环境文件如下:

// locale/fa.js
define([], function() {
    var enToFaDigit(n) { // a function converts a number to persian representation };
    // more stuff
    return {
        number: enToFaDigit
    };
});

现在的问题是我不知道 App 模块何时加载 number 方法。如果我确定 locale/fa 模块 应该 在某个时候加载,我可以使用 require(['locale/fa'] 包装它或使用 shim。目前我正在使用旧的阻塞方式来加载适当的locale/*.js 和 PHP 来选择正确的文件,没有问题。但我想知道 requireJS 程序员如何编写类似的代码。可能有比这段代码更好的方法:

require(['app'], function(App) {
    if(App.env.locale == 'fa') {
        require(['locale/fa'], function(fa) {
            // 8-S
        }
    }
});

【问题讨论】:

    标签: javascript requirejs


    【解决方案1】:

    这听起来像是i18n plugin!我相信您可以定义函数和字符串。我会像这样定义一个包:

    //nls/formatters.js
    define({
        root: {
            currency: function(num) {
                // implementation for default currency format (en-US often)
            }
        },
        "fa": true
    })
    

    这是你的波斯语覆盖:

    //nls/fa/formatters.js
    define({
        currency: function(num) {
            // implementation for farsi currency format
        }
    })
    

    在您的 app.js 文件中:

    require(['app','i18n!nls/formatters'], function(App, Formatters) {
        Formatters.currency(5.00); // works!
    });
    

    【讨论】:

    • 谢谢,这绝对有用,但我的问题更笼统,不仅仅是本地化。顺便说一句,如果没有人建议更一般的方式,我会接受你的回答。 (我的问题是直到App 构建之前我不知道应该加载哪个本地化。使用i18n! 我应该在App 加载之前设置语言环境。)
    • 插件访问 navigator.language 属性,因此它读取用户计算机上的语言环境!如果这不适合您的使用,您可以创建一个指定它的 build.js 文件。但是,要更一般地回答您的问题,条件需要 appear 才能工作,但实际上会导致需要所有代码分支(前提是您需要(“”)字符串文字,而不是预设变量。 )
    • navigator.language(这是只读的 AFAIK)或 build.js 不能解决任何问题,因为它们都在 require.config 之前设置了语言环境。无法更改语言环境after that
    • @Reith 的想法是,您将为每个语言环境构建单独的编译文件,这是一种常见的解决方案,然后在最终构建中有条件地要求它们。
    猜你喜欢
    • 2016-02-14
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 2018-01-06
    相关资源
    最近更新 更多