requirejs窗口未定义

时间:2013-08-06 13:36:38

标签: javascript requirejs

当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并在配置中设置语言环境的原因。

有一个解决方案吗? 谢谢。

2 个答案:

答案 0 :(得分:0)

我在运行时javascript方面没有做太多,但我知道你知道并习惯在浏览器中使用的许多库(文档对象模型的“getElementById”,本地存储)在像Grunt这样的运行时中不可用或犀牛。您在该设置文件中使用localStorage似乎是个问题。

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

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

if (window) {
  ...
}
else if (grunt) {
  ...
}

答案 1 :(得分:0)

对我有用的解决方法:

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

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