2

オプティマイザーが grunt によって起動されると、このエラーが発生します (私は yeoman backbone-generator を使用しています)

「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

私のために働いた回避策:

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

しかし、このトリックにはまだ納得していません。多分他の誰かがより良い考えを持っていますか?

于 2014-09-10T13:28:42.027 に答える
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 に答える