6

私はの両方から始めています。アプリに次のようなデバッグ フラグがあります。

var debugEnabled = true;

ビルド内から実行されている最適化false内から自動的にこれを設定できる方法はありますか?requirejsgrunt

編集:requirejs明確にするために、オプティマイザ を実行するデフォルト タスクは 1 つしかありません。変数debugEnabledは、アプリ自体内のモジュールの 1 つ (たとえばAppLogger、 への依存関係)内にありmainます。

requirejsビルドがこの変数をfalseに設定できる方法はありますかAppLogger?console.log

4

2 に答える 2

15

@asgoth答えは間違いなく機能しますが、ビルドプロセス中にコードを「挿入」(または削除)するための他のオプションもいくつか考え出しました。

例のbuild.jsファイルに記載されているように、ビルドを使用してpragmas、ビルドプロセス中にコードスニペットを含めたり除外したりできます。

//Specify build pragmas. If the source files contain comments like so:
//>>excludeStart("fooExclude", pragmas.fooExclude);
//>>excludeEnd("fooExclude");
//Then the comments that start with //>> are the build pragmas.
//excludeStart/excludeEnd and includeStart/includeEnd work, and the
//the pragmas value to the includeStart or excludeStart lines
//is evaluated to see if the code between the Start and End pragma
//lines should be included or excluded. If you have a choice to use
//"has" code or pragmas, use "has" code instead. Pragmas are harder
//to read, but they can be a bit more flexible on code removal vs.
//has-based code, which must follow JavaScript language rules.
//Pragmas also remove code in non-minified source, where has branch
//trimming is only done if the code is minified via UglifyJS or
//Closure Compiler.
pragmas: {
    fooExclude: true
},

//Same as "pragmas", but only applied once during the file save phase
//of an optimization. "pragmas" are applied both during the dependency
//mapping and file saving phases on an optimization. Some pragmas
//should not be processed during the dependency mapping phase of an
//operation, such as the pragma in the CoffeeScript loader plugin,
//which wants the CoffeeScript compiler during the dependency mapping
//phase, but once files are saved as plain JavaScript, the CoffeeScript
//compiler is no longer needed. In that case, pragmasOnSave would be used
//to exclude the compiler code during the save phase.
pragmasOnSave: {
    //Just an example
    excludeCoffeeScript: true
},

私はこれがjquery.mobile コードAMD上で実際に動作しているのを見ることができました。これはおそらく学習と学習に適した場所ですrequirejs

これが私のために働いたものです:

AppLogger.js:

/* global console: false */
define(function () {

  var debugEnabled = false;
//>>excludeStart('appBuildExclude', pragmas.appBuildExclude);
  debugEnabled = true;
//>>excludeEnd('appBuildExclude');
  return {
    log:function (message) {
      if (debugEnabled && console) {
        console.log('APP DEBUG: ' + message);
      }
    }
  };

});

Gruntfile.js:

requirejs:{
  compile:{
    options:{
      baseUrl:"js/",
      mainConfigFile:"js/main.js",
      name:'main',
      out:'js/main.min.js',
      pragmas:{ appBuildExclude:true }
    }
  }
}

のこの構成ではrequirejsGruntfileプラグマ内のセクションexcludeStartexcludeEndがコンパイル/ビルドされたファイルから削除されました。

私はまだ学んrequirejsでいるので、これがこの種のことのベストプラクティスであるとの主張はありませんが、これは確かに私にとってはうまくいきました。

于 2013-03-04T17:36:49.630 に答える
6

2 つのタスクがあるとします。

  • 発達
  • 製造

developmentjshint、coffeescript のコンパイルなど、開発に必要なすべてのことを行います... productionrequirejs の最適化、css の縮小などを行います...

build次に、デバッグ フラグをチェックするタスクを登録できます。

    grunt.registerTask('build', 'run build', function () {
        var task = debugEnabled ? 'development' : 'production';

        // run the targetted task
        grunt.task.run(task);
    });

コマンドラインで、grunt buildそれを実行します。

または、grunt でオプションパラメータを使用することもできます。

    grunt.registerTask('build', 'run build', function () {
        // start development build by default
        var target = grunt.option('target') || 'development';

        // run the targetted task
        grunt.task.run(target);
    });

コマンドラインで、grunt build --target=productionそれを実行します。

編集:

質問を少し誤解しました。私が見る唯一の方法は、別のモジュールでデバッグ フラグを分離することです。

パス/to/debug.js

define(function() {
   return true;
});

次に、本番バージョンを作成します (単調なタスクの近く):

パス/to/grunt/tasks/debug.js

define(function() {
   return false;
});

requirejsタスクで、そのバージョンを指定します。

requirejs: {
   options: {
      paths: {
         debug: 'path/to/grunt/tasks/debug.js'
      }
   }
}
于 2013-03-04T06:42:54.550 に答える