2016-12-20 8 views
1

私は今、私のプロジェクトでWebpackを使っていますが、今朝私が開発したデベロッパーズを更新するまでは素晴らしかったです。それはまだ素晴らしいことだが、私は謎のエラーを持っている:私のコードのいずれもコールスタックでないときWebpack definepluginをログに使用する

{ SyntaxError: Unexpected token (1:5) 
at Parser.pp$4.raise (\node_modules\acorn\dist\acorn.js:2431:15) 
at Parser.pp.unexpected (\node_modules\acorn\dist\acorn.js:616:10) 
at Parser.pp$3.parseExprAtom (\node_modules\acorn\dist\acorn.js:1963:12) 
at Parser.parseExprAtom (\node_modules\acorn-dynamic-import\lib\inject.js:55:31) 
at Parser.pp$3.parseExprSubscripts (\node_modules\acorn\dist\acorn.js:1831:21) 
at Parser.pp$3.parseMaybeUnary (\node_modules\acorn\dist\acorn.js:1808:19) 
at Parser.pp$3.parseExprOps (\node_modules\acorn\dist\acorn.js:1750:21) 
at Parser.pp$3.parseMaybeConditional (\node_modules\acorn\dist\acorn.js:1733:21) 
at Parser.pp$3.parseMaybeAssign (\node_modules\acorn\dist\acorn.js:1710:21) 
at Parser.pp$3.parseParenAndDistinguishExpression (\node_modules\acorn\dist\acorn.js:2008:32) pos: 5, loc: Position { line: 1, column: 5 }, raisedAt: 5 } 

私はそれを愛します! :)

移動する前にこれについてのカップルポイント。

  1. エラーは、プロダクションビルドと単体テストでのみ発生します。 devビルドでは発生しません
  2. エラーは何も失敗しません。ビルドは完了です。すべてのテストが実行され、正常に実行されます。プロダクションビルドに明らかな悪影響はありません。

問題の原因を突き止めるために数分の時間がかかりました。 Webpack Definepluginか、むしろ、私がどのように使っているのかが分かります。私は条件付きで条件付きラッピングせずに自分のコードにデバッグログを注入してきた:

new webpack.DefinePlugin({ 
    DEBUG_LOG: DEBUG ? 'console.log' : '// ', 
    DEBUG_WARN: DEBUG ? 'console.warn' : '// ', 
    DEBUG_ERR: DEBUG ? 'console.error' : '// ' 
}), 

使い方は非常に簡単です:

DEBUG_LOG('something useful'); 
DEBUG_WARN('something unusual'); 
DEBUG_ERR('fire bad! fire bad!'); 

それがDEVで実行すると、私は便利なデバッグメッセージやprodの中にそれらのメッセージを取得しますコメントに変換され、マイナーに取り除かれます。

WebpackがAcornJSを使用しているように見えますが、私がここでやったことに満足できず、なぜそれほど難しいのか分かりません。プラグインを実行する前に、未定義の関数を評価するだけです。デベロッパーではconsole.logと評価され、Acornはであると考えられます。です。 prod/testでは、コメントに評価されます。これは、単一行のコメントである限り、問題ありません。一方ではすべてが機能しているように見えますが、間違いが気になるので、なぜこれを野生に再リリースする前に不平を言っているのか理解したいと思います。何かご意見は?あなたのデバッグバージョンのWebPACKで

答えて

0

は、次のことを行います。

DEBUG_LOG('test ' + myvar); 

は1つが思うだろうように、それは生命維持(すぐに呼び出される関数の実行)とするだけでなく、文字列の置き換えだ

(console.log)('test ' + myvar); 

になります。 それはこのような何か作成しますので、これは、コメントが動作しないことを意味します

(//)('test ' + myvar); 

明らかに間違っ間違った構文を持ち、物事が失敗する場所です。

あなたのソリューションは壊れやすく、代わりにstrip-loaderを使用することをお勧めします。

+0

あなたの分析は私の出力で見たものと一致しません(折り返し括弧はありません)...ディスクに書き込まれる前に中間ステップがありますか?脆弱性に関しては、確かに... definepluginは、このようなソリューションがより一般的な伝統的なコンパイラの '#define'に触発されていますが、プラグインはこれをより堅牢にするためにマクロのようなサポートが必要です。私はStrip Loaderで試してみて、それがうまくいくならこの答えを受け入れます。 –

関連する問題