Webpackビギナヌズガむド





良い䞀日、友達Tyler McGinnisによる



蚘事「Webpack穏やかな玹介」の翻蚳を玹介したす。



新しいテクノロゞヌを怜蚎する前に、次の2぀の質問を自問しおください。



  1. なぜこのツヌルが必芁なのですか
  2. どのようなタスクを実行したすか


これらの質問に答えられない堎合は、勉匷しおいるテクノロゞヌは必芁ないかもしれたせん。Webpackに関連しおこれらの質問に答えおみたしょう。



なぜりェブパックが必芁なのですか



Webpackはモゞュヌルビルダヌです。アプリケヌションモゞュヌルを解析し、䟝存関係グラフを䜜成しおから、モゞュヌルを正しい順序で1぀以䞊のバンドルにアセンブルしたす。これらのバンドルは、「index.html」ファむルで参照できたす。



App.js ->       |
Dashboard.js -> | Bundler | -> bundle.js
About.js ->     |


webpackはどのような問題を解決したすか



通垞、JavaScriptアプリケヌションを䜜成するずき、コヌドはいく぀かの郚分モゞュヌルに分割されたす。次に、「index.html」ファむルで、各スクリプトぞのリンクを指定する必芁がありたす。



<body>

    ...
    
    <script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
    <script src="libs/react.min.js"></script>
    <script src='src/admin.js'></script>
    <script src='src/dashboard.js'></script>
    <script src='src/api.js'></script>
    <script src='src/auth.js'></script>
    <script src='src/rickastley.js'></script>
</body>


これは面倒なだけでなく、゚ラヌが発生しやすくなりたす。スクリプトを忘れるだけでなく、正しい順序で配眮するこずも重芁です。React自䜓をロヌドする前にReactに䟝存するスクリプトをロヌドするず、アプリケヌションが砎損したす。Webpackはこれらの問題を解決したす。すべおのスクリプトを順番に含めるこずを心配する必芁はありたせん。



<body>

    ...
    
    <script src='dist/bundle.js'></script>
</body>


すぐに孊習するように、モゞュヌルの収集はWebpackの動䜜の1぀の偎面にすぎたせん。必芁に応じお、バンドルに远加する前に、Webpackにいく぀かのモゞュヌル倉換を匷制するこずができたす。たずえば、SASS / LESSを通垞のCSSに倉換したり、叀いブラりザの堎合は最新のJavaScriptをES5に倉換したりしたす。



Webパックのむンストヌル



npmを䜿甚しおプロゞェクトを初期化した埌、Webpackを機胜させるには、2぀のパッケヌゞwebpackおよびをむンストヌルする必芁がありたすwebpack-cli。



npm i webpack webpack-cli -D


webpack.config.js



これらのパッケヌゞをむンストヌルした埌、Webパックを構成する必芁がありたす。これを行うためにwebpack.config.js、オブゞェクトを゚クスポヌトするファむルが䜜成されたす。このオブゞェクトには、Webpack蚭定が含たれおいたす。



module.exports = {}


Webpackの䞻なタスクは、モゞュヌルを分析し、それらをオプションで倉換し、それらを1぀以䞊のバンドルにむンテリゞェントに結合するこずです。そのため、Webpackは次の3぀のこずを知る必芁がありたす。



  1. アプリケヌション゚ントリポむント
  2. 実行する倉換
  3. 生成されたバンドルを配眮する堎所


゚ントリヌポむント



アプリケヌションに含たれるモゞュヌルの数に関係なく、垞に単䞀の゚ントリポむントがありたす。このモゞュヌルには残りが含たれおいたす。通垞、このファむルはindex.jsです。次のようになりたす。



index.js
  imports about.js
  imports dashboard.js
    imports graph.js
    imports auth.js
      imports api.js


このファむルぞのパスをWebpackに指瀺するず、Webpackはそれを䜿甚しおアプリケヌションの䟝存関係グラフを䜜成したす。これを行うentryには、メむンファむルぞのパスの倀を䜿甚しおWebpack蚭定にプロパティを远加する必芁がありたす。



module.exports = {
    entry: './app/index.js'
}


ロヌダヌによる倉換



゚ントリポむントを远加した埌、バンドルを生成する前に実行する必芁のある倉換に぀いおWebパックに通知する必芁がありたす。このために、ロヌダヌが䜿甚されたす。



デフォルトでは、オペレヌタヌベヌスの䟝存関係グラフを生成する堎合、import / require()WebpackはJavaScriptファむルずJSONファむルのみを凊理できたす。



import auth from './api/auth' // 
import config from './utils/config.json' // 
import './styles.css' // 
import logo from './assets/logo.svg' // 


アプリケヌションでJSファむルずJSONファむルに制限するこずはほずんどありたせん。ほずんどの堎合、スタむル、SVG、画像なども必芁になりたす。そこでロヌダヌが登堎したす。ロヌダヌの䞻なタスクは、その名前が瀺すように、WebパックがJSファむルやJSONファむル以倖のものでも機胜するようにするこずです。



最初のステップは、ロヌダヌをむンストヌルするこずです。SVGをロヌドしたいので、npmを䜿甚しおsvg-loaderをむンストヌルしたす。



npm i svg-inline-loader -D 


次に、それをWebpack蚭定に远加したす。すべおのロヌダヌはオブゞェクトの配列に含たれおいたすmodule.rules



module.exports = {
    entry: './app/index.js',
    module: {
        rules: []
    }
}


ロヌダヌ情報は2぀の郚分で構成されおいたす。1぀目は、凊理されおいるファむルのタむプです.svgこの堎合。2぀目は、このタむプのファむルこのsvg-inline-loader堎合を凊理するために䜿甚されるロヌダヌです。



module.exports = {
  entry: './app/index.js',
  module: {
    rules: [
      { test: /\.svg$/, use: 'svg-inline-loader' }
    ]
  }
}


これで、SVGファむルをむンポヌトできたす。しかし、CSSファむルはどうですか䜿甚されるスタむルの堎合css-loader。



npm i css-loader -D 


module.exports = {
  entry: './app/index.js',
  module: {
    rules: [
      { test: /\.svg$/, use: 'svg-inline-loader' },
      { test: /\.css$/, use: 'css-loader' }
    ]
  }
}


これで、SVGファむルずCSSファむルの䞡方をむンポヌトできたす。ただし、スタむルが正しく機胜するためには、別のロヌダヌを远加する必芁がありたす。のおかげで、css-loaderCSSファむルをむンポヌトできたす。しかし、それはそれらがDOMに含たれるずいう意味ではありたせん。このようなファむルをむンポヌトするだけでなく<style>、DOM芁玠に適甚されるようにタグに配眮する必芁がありたす。このために必芁style-loaderです。



npm i style-loader -D 


module.exports = {
  entry: './app/index.js',
  module: {
    rules: [
      { test: /\.svg$/, use: 'svg-inline-loader' },
      { test: /\.css$/, use: [ 'style-loader', 'css-loader' ] }
    ]
  }
}


CSSファむルの凊理には2぀のロヌダヌが䜿甚されるため、プロパティ倀useは配列であるこずに泚意しおください。たた、ロヌダヌの順序にも泚意しおください。最初にstyle-loader、次にcss-loader。倧事です。Webpackはそれらを逆の順序で適甚したす。最初css-loaderにむンポヌト'./styles.css'に䜿甚され、次にstyle-loaderDOMにスタむルを挿入するために䜿甚されたす。



ロヌダヌは、ファむルのむンポヌトだけでなく、ファむルの倉換にも䜿甚できたす。最も人気があるのは、Babelを䜿甚しお次䞖代のJavaScriptを最新のJavaScriptに倉換するこずです。これに䜿甚されたすbabel-loader。



npm i babel-loader -D 


module.exports = {
  entry: './app/index.js',
  module: {
    rules: [
      { test: /\.svg$/, use: 'svg-inline-loader' },
      { test: /\.css$/, use: [ 'style-loader', 'css-loader' ] },
      { test: /\.(js)$/, use: 'babel-loader' }
    ]
  }
}


ほずんどすべおのタむプのファむル甚のロヌダヌがありたす。



出口点



これで、Webpackぱントリポむントずロヌダヌに぀いお認識したす。次のステップは、バンドルのディレクトリを指定するこずです。これを行うoutputには、Webpack蚭定にプロパティを远加したす。



const path = require('path')

module.exports = {
  entry: './app/index.js',
  module: {
    rules: [
      { test: /\.svg$/, use: 'svg-inline-loader' },
      { test: /\.css$/, use: [ 'style-loader', 'css-loader' ] },
      { test: /\.(js)$/, use: 'babel-loader' }
    ]
  },
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'index_bundle.js'
  }
}


プロセス党䜓は次のようになりたす。



  1. Webpackは、次の堎所にある゚ントリポむントを受け取りたす。 ./app/index.js
  2. ステヌトメントimport / requireを解析し、䟝存関係グラフを䜜成したす
  3. Webpackは、適切なロヌダヌを䜿甚しおコヌドを倉換するこずにより、バンドルの構築を開始したす
  4. 圌はバンドルを集めお入れたす dist/index_bundle.js


プラグむン



バンドルの生成前たたは生成䞭に、ロヌダヌを䜿甚しお個々のファむルを凊理する方法を芋おきたした。ロヌダヌずは異なり、プラグむンを䜿甚するず、バンドルを䜜成した埌にタスクを実行できたす。これらのタスクは、バンドル自䜓ず他のコヌドの䞡方に関係する可胜性がありたす。プラグむンは、より匷力で制限の少ないロヌダヌず考えるこずができたす。



䟋を芋おみたしょう。



HtmlWebpackPlugin



Webpackの䞻なタスクは、で参照できるバンドルを生成するこずindex.htmlです。バンドルのあるディレクトリに



HtmlWebpackPlugin䜜成index.htmlし、バンドル内のバンドルぞのリンクを自動的に远加したす。



バンドルに名前を付けおindex_bundle.js、に入れたしたdist。ディレクトリにHtmlWebpackPlugin新しいファむルを䜜成し、バンドルぞのリンクを远加したす- 。すごいですね。生成されるため、出口点やバンドル名を倉曎しおも、この情報を受け取り、内容を倉曎したす。 このプラグむンをどのように䜿甚したすかい぀ものように、最初にむンストヌルする必芁がありたす。index.htmldist<script src='index_bundle.js'></script>index.htmlHtmlWebpackPluginHtmlWebpackPluginindex.html







npm i html-webpack-plugin -D 


次に、プロパティをWebpack蚭定に远加したすplugins。



const path = require('path')

module.exports = {
  entry: './app/index.js',
  module: {
    rules: [
      { test: /\.svg$/, use: 'svg-inline-loader' },
      { test: /\.css$/, use: [ 'style-loader', 'css-loader' ] },
      { test: /\.(js)$/, use: 'babel-loader' }
    ]
  },
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'index_bundle.js'
  },
  plugins: []
}


HtmlWebpackPlugin配列に むンスタンスを䜜成したすplugins。




const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
  entry: './app/index.js',
  module: {
    rules: [
      { test: /\.svg$/, use: 'svg-inline-loader' },
      { test: /\.css$/, use: [ 'style-loader', 'css-loader' ] },
      { test: /\.(js)$/, use: 'babel-loader' }
    ]
  },
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'index_bundle.js'
  },
  plugins: [
    new HtmlWebpackPlugin()
  ]
}


EnvironmentPlugin



Reactを䜿甚しおいる堎合は、アプリケヌションをデプロむする前process.env.NODE_ENVに、これを倀productionに蚭定するこずをお勧めしたす。これにより、譊告などの開発ツヌルを削陀するこずで、Reactを本番環境に組み蟌むこずができたす。webpackを䜿甚するず、プラグむンを介しおこれを行うこずができたすEnvironmentPlugin。これはWebpackの䞀郚であるため、むンストヌルする必芁はありたせん。



const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const webpack = require('webpack')

module.exports = {
  entry: './app/index.js',
  module: {
    rules: [
      { test: /\.svg$/, use: 'svg-inline-loader' },
      { test: /\.css$/, use: [ 'style-loader', 'css-loader' ] },
      { test: /\.(js)$/, use: 'babel-loader' }
    ]
  },
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'index_bundle.js'
  },
  plugins: [
    new HtmlWebpackPlugin(),
    new webpack.EnvironmentPlugin({
      'NODE_ENV': 'production'
    })
  ]
}


これで、アプリケヌションのどこでも、を䜿甚しおプロダクションモヌドを蚭定できたすprocess.env.NODE_ENV。



HtmlWebpackPluginそしお、EnvironmentPluginWebPACKのプラグむンシステムのほんの䞀郚です。



モヌド



制䜜甚のアプリケヌションを準備するプロセスでは、いく぀かの手順を実行する必芁がありたす。そのうちの1぀であるprocess.env.NODE_ENVvalueぞの蚭定に぀いお説明したしたproduction。もう1぀のアクションは、コヌドを瞮小し、コメントを削陀しおバンドルのサむズを瞮小するこずです。



これらのタスクを解決するための特別なプラグむンがありたすが、より簡単な方法がありたす。WebPACKの蚭定では、蚭定するこずができたすmodeしdevelopmentたりproduction、開発環境によっお異なりたす。



const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
  entry: './app/index.js',
  module: {
    rules: [
      { test: /\.svg$/, use: 'svg-inline-loader' },
      { test: /\.css$/, use: [ 'style-loader', 'css-loader' ] },
      { test: /\.(js)$/, use: 'babel-loader' }
    ]
  },
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'index_bundle.js'
  },
  plugins: [
    new HtmlWebpackPlugin()
  ],
  mode: 'production'
}


を削陀したしたのでご泚意くださいEnvironmentPlugin。実際にはmode、倀を蚭定した埌、productionWebpackは自動的にprocess.env.NODE_ENV倀を割り圓おたすproduction。これにより、コヌドが最小化され、譊告が削陀されたす。



Webパックの起動



Webpackの動䜜ず構成方法は珟時点ではわかっおいたすが、実行する必芁がありたす。実行するために䜜成できる



ファむルがありたす。package.jsonscriptwebpack



"scripts": {
  "build": "webpack"
}


これnpm run buildで、タヌミナルでコマンドを実行するず、Webpackが起動し、最適化されたバンドルが䜜成されindex_bundle.js、に配眮されdistたす。



開発および生産モヌド



党䜓ずしお、Webpackは完了です。最埌に、モヌドを切り替える方法を芋おみたしょう。



生産のために構築するずき、私たちは可胜な限りすべおを最適化したいず考えおいたす。開発モヌドの堎合、その逆が圓おはたりたす。



モヌドを切り替えるには、で2぀のスクリプトを䜜成する必芁がありたすpackage.json。



npm run buildプロダクションバンドルを構築したす。



npm run start開発サヌバヌを起動し、ファむルの倉曎を監芖したす。



芚えおいるかず思いたすが、これはWebpack蚭定のmode倀productionに蚭定されおいたす。しかし、今は必芁ありたせん。実行するコマンドに応じお、環境倉数に適切な倀を蚭定する必芁がありたす。のスクリプトbuildを倉曎しおみたしょうpackage.json。



"scripts": {
  "build": "NODE_ENV='production' webpack",
}


Windowsを䜿甚しおいる堎合、コマンドは次のようになりたす"SET NODE_ENV='production' && webpack"。



これで、Webpack蚭定で、にmode応じお倀を倉曎できたすprocess.env.NODE_ENV。



...

  mode: process.env.NODE_ENV === 'production' ? 'production' : 'development'
}


アプリケヌション甚の既補のバンドルを䜜成するにnpm run buildは、タヌミナルで実行するだけです。ディレクトリdistファむルが䜜成されindex.html、index_bunlde.js。



開発サヌバヌ



アプリケヌションの開発に関しおは、スピヌドが重芁です。Webパックを再起動しお、倉曎のたびに新しいビルドを埅぀必芁はありたせん。ここでパッケヌゞが圹に立ちwebpack-dev-serverたす。



名前が瀺すように、これは開発甚のWebpackサヌバヌです。ディレクトリを䜜成する代わりに、distデヌタをメモリに保存し、ロヌカルサヌバヌで凊理したす。さらに、ラむブリブヌトをサポヌトしたす。これは、倉曎を加えるずwebpack-dev-serverファむルが再構築され、ブラりザが再起動するこずを意味したす。



パッケヌゞをむンストヌルしたす。



npm i webpack-dev-server -D 


あずは、スクリプトstartをに远加するだけですpackage.json。



"scripts": {
  "build": "NODE_ENV='production' webpack",
  "start": "webpack-dev-server"
}


これで、開発サヌバヌを起動するコマンドず、完成したバンドルをビルドするコマンドの2぀のコマンドがありたす。



この蚘事がお圹に立おば幞いです。枅聎ありがずうございたした。



All Articles