2017-05-12 22 views
0

CommonJS + Webpackモジュールを使用してnodejs/expressアプリケーションのクライアントJavaScriptをリファクタリングしようとしています。Webpackを使用したJavascriptモジュール

Webpackでは、2つのjsファイルからなる 'bundle.js'をビルドします。ここでは、CommongJS構文に従って2つのモジュールを定義しました。しかし、ページのwindow.onloadに私は素敵な「TypeError例外を取得:moveTo.logHelloWorldは機能」エラーではありません私は間違っ

WebPACKの構成:?

var webpack = require('webpack'); 
var path = require('path'); 

module.exports = { 
    entry: ['./public/js/common.js', './public/js/moveTo.js'], 
    output: { 
    path: path.resolve(__dirname, './dist'), 
    filename: 'bundle.min.js' 
    }, 
    plugins: process.env.NODE_ENV === 'production' ? [ 
    new webpack.optimize.OccurrenceOrderPlugin(), 
    new webpack.optimize.UglifyJsPlugin() 
    ] : [] 
} 

moveTo.js

var moveTo = {}; 

console.log("moveTo.js loaded..."); 

moveTo.logHelloWorld = function(){ 
    console.console.log("Hello World logHelloWorld() from moveTo client Javascript!"); 
}; 

module.exports = moveTo; 

moveTo.handlebar WebPACKので構築されたの

<div>MoveTo</div> 
<script type="text/javascript"> 
    window.onload = function(){ 
    console.log("ON LOAD..."); 
    moveTo.logHelloWorld(); 
    } 
</script> 

、最終的にはメインテンプレートに私が含まbundle.js:

<script src="/bundle.min.js" type="text/javascript"></script> 

そして、これは私が得たエラーです:

enter image description here

更新:複数のクライアントjsファイルを使用する方法 別のtest.jsはそうのように、独自のモジュールを使用してファイル:

test.js WebPACKのコンフィグ

var test = {}; 

console.log("test.js loaded..."); 

test.logHelloWorld = function(){ 
    console.log("Hello World logHelloWorld() from TEST client Javascript!"); 
}; 

module.exports = test; 

そして:

私は仕事にこれを得ることができますどのように
var webpack = require('webpack'); 
var path = require('path'); 

module.exports = { 
    entry: ['./public/js/common.js', './public/js/moveTo.js', './public/js/test.js'], 
    output: { 
    path: path.resolve(__dirname, './dist'), 
    filename: 'bundle.min.js', 
    library: ["moveTo", "test"] //This is not working. 
    }, 
    plugins: process.env.NODE_ENV === 'production' ? [ 
    new webpack.optimize.OccurrenceOrderPlugin(), 
    new webpack.optimize.UglifyJsPlugin() 
    ] : [] 
} 

を? UPDATE

: これは私が提案しWebPACKの構成を使用し得るものである enter image description here

#LASTアップデート#

どうやらシングルbundle.jsを持っており、それが動作するように取得する方法はありません異なるjavascriptファイルで

webpack.config.js

var webpack = require('webpack'); 
var path = require('path'); 
// ['./public/js/common.js', './public/js/moveTo.js', './public/js/test.js'], 
module.exports = { 
    entry: './public/js/t3toolbox.js', 
    output: { 
    path: path.resolve(__dirname, './dist'), 
    filename: 'bundle.min.js', 
    library: ["t3toolbox", "[name]"] 
    }, 
    plugins: process.env.NODE_ENV === 'production' ? [ 
    new webpack.optimize.OccurrenceOrderPlugin(), 
    new webpack.optimize.UglifyJsPlugin() 
    ] : [] 
} 

t3toolbox.js

var t3toolbox = {}; // Global App NameSpace 
var test = require('./test.js'); 
var moveTo = require('./moveTo.js'); 

t3toolbox.moveTo = moveTo; 
t3toolbox.test = test; 

module.exports = t3toolbox; 

のmoveTo:これは私が@hazardousの貴重な助けを借りて、これまで達し唯一のものです。あなたがあなたを見ることができるように、まだメイン AFを使用する必要がJS

var moveTo = {}; 

console.log("moveTo.js loaded..."); 

moveTo.logHelloWorld = function(){ 
    console.log("Hello World logHelloWorld() from MOVETO client Javascript!"); 
}; 

module.exports = moveTo; 

test.js

var test = {}; 

console.log("test.js loaded..."); 

test.logHelloWorld = function(){ 
    console.log("Hello World logHelloWorld() from TEST client Javascript!"); 
}; 

module.exports = test; 

moveTo.handlebars

のmoveTo
<script type="text/javascript"> 
    window.onload = function(){ 
    console.log("ON LOAD..."); 
    t3toolbox.main.moveTo.logHelloWorld(); 
    t3toolbox.main.test.logHelloWorld(); 
    } 
</script> 

ter t3toolbox。あなたのライブラリ場合

var webpack = require('webpack'); 
var path = require('path'); 

module.exports = { 
    entry: ['./public/js/common.js', './public/js/moveTo.js'], 
    output: { 
    path: path.resolve(__dirname, './dist'), 
    filename: 'bundle.min.js', 
    library: 'moveTo' 
    }, 
    plugins: process.env.NODE_ENV === 'production' ? [ 
    new webpack.optimize.OccurrenceOrderPlugin(), 
    new webpack.optimize.UglifyJsPlugin() 
    ] : [] 
} 

- そのような

var mylibrary = { 
    main: { 
    moveTo: {/*...*/}, 
    test: {/*...*/} 
    } 
} 
+0

スクリプトタグはどこに追加されていますか? – brk

+0

bundle.jsで最後のものを意味しますか?このスクリプトタグは、アプリケーションのmain.handlebarsレイアウトに含まれています。 moveTo.logHelloWorld()関数を呼び出す場所を参照する場合は、moveTo.handlebarsテンプレートの末尾にそのタグが追加され、ここでは、関数を呼び出すページを参照します。 – Roberto

+0

このスクリプトタグをヘッダー内に追加してみてください – brk

答えて

1

追加してみてくださいlibraryからoutput設定、:私はそれは常にで終わるあなたが

var mylibrary = { 
    moveTO: {/*...*/}, 
    test: {/*...*/} 
} 

で終わる構成で実現しませんいくつかの輸出企業があり、これを使用してください -

var webpack = require('webpack'); 
var path = require('path'); 

module.exports = { 
    entry: ['./public/js/common.js', './public/js/moveTo.js'], 
    output: { 
    path: path.resolve(__dirname, './dist'), 
    filename: 'bundle.min.js', 
    library: ["mylibrary", "[name]"] 
    }, 
    plugins: process.env.NODE_ENV === 'production' ? [ 
    new webpack.optimize.OccurrenceOrderPlugin(), 
    new webpack.optimize.UglifyJsPlugin() 
    ] : [] 
} 

この例はhttps://github.com/webpack/webpack/blob/master/examples/multi-part-library/webpack.config.js#L10に基づいています。

この設定例は、このフォームのエクスポートを作成します。

var mylibrary : { 
    "common": {/* exports from common */}, 
    "moveTo": {/* exports from moveTo */} 
} 

だからmylibrary.commonを使用してコードでそれらを使用することができ、mylibrary.moveToなど

をあなたがクラブにすべてをしたくない場合「てMyLibrary」であなたの輸入は、あなたがlibraryに変更することができます -

library:"[name]" 

これは、別の作成しますvar moveTo = ...およびvar test = ...のエクスポート。

+0

それは動作します!ありがとうございました! しかし、別のページで呼び出すために、リストに別のモジュールを追加したいのですが?ライブラリ構成に配列を使用する必要がありますか? – Roberto

+0

マルチエクスポートライブラリをサポートするための答えを更新しました。また、問題を解決した場合は、その答えを受け入れてください。ありがとう。 – hazardous

+0

'library:[" mylibrary "、" [name] "]'、 '' [name]」はそのままで、 'test'で置き換えないでください:)。エントリの名前で置き換えられる特別なプレースホルダです。だからこれを修正すると、出力ライブラリはこの形になります。 'mylibrary:{" common ":...、" moveTo ":...、" test ":...}'。これはあまり混乱しないといいですね:)。 – hazardous

関連する問題