当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并在配置中设置语言环境的原因。
有一个解决方案吗? 谢谢。
答案 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';
}
})()
}
}
但仍然不相信这个伎俩。也许别人有更好的主意?