2

当优化器由 grunt 启动时出现此错误(我正在使用 yeoman 主干生成器)

运行“requirejs:dist”(requirejs)任务错误:ReferenceError:未定义窗口

我正在使用 requirejs 和插件 i18n。这是我的 main.js

    require.config({
    //locale: "en",
    shim: {
        underscore: {
            exports: '_'
        },
        backbone: {
            deps: [
                'underscore',
                'jquery'
            ],
            exports: 'Backbone'
        },
        'jquery-notify': {
            deps: [
                'jquery'
            ]
        },
        swiper: {
            deps: [
                'jquery'
            ],
            exports: 'Swiper'
        },
        bstrapcollapse: {
            deps: [
            'jquery',
            'bstraptransition'
            ],
            exports: 'collapse',
        }
    },
    paths: {
        jquery: '../bower_components/jquery/jquery',
        backbone: '../bower_components/backbone-amd/backbone',
        underscore: '../bower_components/underscore-amd/underscore',

        i18n: '../bower_components/requirejs-i18n/i18n',

        'backbone.marionette': '../bower_components/backbone.marionette/lib/core/amd/backbone.marionette',
        'backbone.wreqr': '../bower_components/backbone.wreqr/lib/amd/backbone.wreqr',
        'backbone.babysitter': '../bower_components/backbone.babysitter/lib/amd/backbone.babysitter',
        'jquery-ui': '../bower_components/jquery-ui/ui/jquery-ui',
        loglevel: '../bower_components/loglevel/dist/loglevel.min',
        moment: '../bower_components/moment/moment',
        alertify: '../bower_components/alertify/alertify',
        swiper: '../bower_components/swiper/dist/idangerous.swiper-2.0.min',
        fastclick: '../bower_components/fastclick/lib/fastclick',
        bstrapcollapse: '../bower_components/sass-bootstrap/js/bootstrap-collapse',
        bstraptransition: '../bower_components/sass-bootstrap/js/bootstrap-transition',

        'requirejs-text': '../bower_components/requirejs-text/text',
        async: '../bower_components/requirejs-plugins/src/async',
    },
    config: {
        i18n: {
            locale: JSON.parse(window.localStorage.getItem('settings')).language || 'en',
        }
    }
});

我需要根据用户输入更改语言,这就是为什么我需要获取 localStorage 并在配置中设置语言环境。

有解决办法吗?谢谢你。

4

2 回答 2

0

我在运行时 javascript 方面做得不多,但我知道您知道并在浏览器中使用的许多库(文档对象模型的“getElementById”,本地存储)在 Grunt 或 Rhino 等运行时中不可用。您在该设置文件中使用 localStorage 似乎是问题所在。

相反,您需要使用提供给您的任何 API。例如,快速搜索发现了一些 Grunt 示例,它们读取/写入文件系统上的文件: http: //gruntjs.com/sample-gruntfile

显然,这在浏览器中是不可能的,因为浏览器不允许您访问文件;但你也可以在 Grunt 中利用它。您还可以使用以下子句功能检测您所处的模式:

if (window) {
  ...
}
else if (grunt) {
  ...
}
于 2013-08-06T13:52:09.370 回答
0

对我有用的解决方法:

config: {
    i18n: {
        locale: (function(){              
            try{
                return localStorage.getItem('locale') || 'en' ;
            }catch(ex){
                return 'en';
            }
        })()
    }
}

但仍然不相信这个伎俩。也许其他人有更好的主意?

于 2014-09-10T13:28:42.027 回答