ホームページ  >  記事  >  ウェブフロントエンド  >  Webpack パッケージャーの簡単な紹介

Webpack パッケージャーの簡単な紹介

零下一度
零下一度オリジナル
2017-06-26 10:37:231800ブラウズ

Concept

webpack は、最新の JavaScript アプリケーション用のモジュール バンドラーです。

webpack がアプリケーションを処理するとき、依存関係グラフ (アプリケーションが必要とするすべてのモジュールを含む) を再帰的に構築し、これらのモジュールをいくつかの Budle ファイル (通常は 1 つだけ、プロジェクトに応じてブラウザーによってロードされます) にパッケージ化します。条件)。

これは素晴らしい構成ですが、始める前に、エントリー、出力、ローダー、プラグインという 4 つの中心的な概念を理解するだけで済みます。

設定オブジェクト オプション
webpack.config.js

const path = require('path');

module.exports = {
  // click on the name of the option to get to the detailed documentation
  // click on the items with arrows to show more examples / advanced options

  entry: "./app/entry", // string | object | array
  // Here the application starts executing
  // and webpack starts bundling

  output: {
    // options related to how webpack emits results

    path: path.resolve(__dirname, "dist"), // string
    // the target directory for all output files
    // must be an absolute path (use the Node.js path module)

    filename: "bundle.js?1.1.11", // string
    // the filename template for entry chunks

    publicPath: "/assets/", // string
    // the url to the output directory resolved relative to the HTML page

    library: "MyLibrary", // string,
    // the name of the exported library

    libraryTarget: "umd", // universal module definition
    // the type of the exported library

    /* Advanced output configuration (click to show) */
  },

  module: {
    // configuration regarding modules

    rules: [
      // rules for modules (configure loaders, parser options, etc.)

      {
        test: /\.jsx?$/,
        include: [
          path.resolve(__dirname, "app")
        ],
        exclude: [
          path.resolve(__dirname, "app/demo-files")
        ],
        // these are matching conditions, each accepting a regular expression or string
        // test and include have the same behavior, both must be matched
        // exclude must not be matched (takes preferrence over test and include)
        // Best practices:
        // - Use RegExp only in test and for filename matching
        // - Use arrays of absolute paths in include and exclude
        // - Try to avoid exclude and prefer include

        issuer: { test, include, exclude },
        // conditions for the issuer (the origin of the import)

        enforce: "pre",
        enforce: "post",
        // flags to apply these rules, even if they are overridden (advanced option)

        loader: "babel-loader",
        // the loader which should be applied, it'll be resolved relative to the context
        // -loader suffix is no longer optional in webpack2 for clarity reasons
        // see webpack 1 upgrade guide

        options: {
          presets: ["es2015"]
        },
        // options for the loader
      },

      {
        test: "\.html$",

        use: [
          // apply multiple loaders and options
          "htmllint-loader",
          {
            loader: "html-loader",
            options: {
              /* ... */
            }
          }
        ]
      },

      { oneOf: [ /* rules */ ] },
      // only use one of these nested rules

      { rules: [ /* rules */ ] },
      // use all of these nested rules (combine with conditions to be useful)

      { resource: { and: [ /* conditions */ ] } },
      // matches only if all conditions are matched

      { resource: { or: [ /* conditions */ ] } },
      { resource: [ /* conditions */ ] },
      // matches if any condition is matched (default for arrays)

      { resource: { not: /* condition */ } }
      // matches if the condition is not matched
    ],

    /* Advanced module configuration (click to show) */
  },

  resolve: {
    // options for resolving module requests
    // (does not apply to resolving to loaders)

    modules: [
      "node_modules",
      path.resolve(__dirname, "app")
    ],
    // directories where to look for modules

    extensions: [".js?1.1.11", ".json", ".jsx", ".css?1.1.11"],
    // extensions that are used

    alias: {
      // a list of module name aliases

      "module": "new-module",
      // alias "module" -> "new-module" and "module/path/file" -> "new-module/path/file"

      "only-module$": "new-module",
      // alias "only-module" -> "new-module", but not "module/path/file" -> "new-module/path/file"

      "module": path.resolve(__dirname, "app/third/module.js?1.1.11"),
      // alias "module" -> "./app/third/module.js?1.1.11" and "module/file" results in error
      // modules aliases are imported relative to the current context
    },
    /* alternative alias syntax (click to show) */

    /* Advanced resolve configuration (click to show) */
  },

  performance: {
    hints: "warning", // enum
    maxAssetSize: 200000, // int (in bytes),
    maxEntrypointSize: 400000, // int (in bytes)
    assetFilter: function(assetFilename) {
      // Function predicate that provides asset filenames
      return assetFilename.endsWith('.css') || assetFilename.endsWith('.js');
    }
  },

  devtool: "source-map", // enum
  // enhance debugging by adding meta info for the browser devtools
  // source-map most detailed at the expense of build speed.

  context: __dirname, // string (absolute path!)
  // the home directory for webpack
  // the entry and module.rules.loader option
  //   is resolved relative to this directory

  target: "web", // enum
  // the environment in which the bundle should run
  // changes chunk loading behavior and available modules

  externals: ["react", /^@angular\//],
  // Don't follow/bundle these modules, but request them at runtime from the environment

  stats: "errors-only",
  // lets you precisely control what bundle information gets displayed

  devServer: {
    proxy: { // proxy URLs to backend development server
      '/api': 'http://localhost:3000'
    },
    contentBase: path.join(__dirname, 'public'), // boolean | string | array, static file location
    compress: true, // enable gzip compression
    historyApiFallback: true, // true for index.html upon 404, object for multiple paths
    hot: true, // hot module replacement. Depends on HotModuleReplacementPlugin
    https: false, // true for self-signed, object for cert authority
    noInfo: true, // only errors & warns on hot reload
    // ...
  },

  plugins: [
    // ...
  ],
  // list of additional plugins


  /* Advanced configuration (click to show) */
}

このドキュメントの目的は、詳細な概念の特定の使用例へのリンクを提供しながら、これらの概念の高レベルの概要を提供することです。

Entry

webpack は、すべてのアプリケーションの依存関係グラフを作成します。この依存関係グラフの開始点は、既知のエントリ ポイントです。このエントリ ポイントは、既知の依存関係グラフに基づいて webpack をどこから開始してパッケージ化するかを指示します。アプリケーションのエントリ ポイントは、コンテキスト ルート、またはアプリケーションを開始する最初のファイルと考えることができます。

webpack設定オブジェクトのentry属性でエントリポイントを定義します。簡単な例は次のとおりです。

module.exports = {
  entry: './path/to/my/entry/file.js'
};

エントリ属性を宣言するにはいくつかの方法があります:

1. 単一エントリの構文

const config = {
  entry: './path/to/my/entry/file.js'
};

module.exports = config;

2. 複数ページのアプリケーション

const config = {
  entry: {
    app: './src/app.js',
    vendors: './src/vendors.js'
  }
};

出力

すべてのコードをパッケージ化したら、webpack にそれをパッケージ化する場所を指示する必要があります。出力属性は、コードの処理方法を webpack に指示します。

const config = {
  entry: {
    pageOne: './src/pageOne/index.js',
    pageTwo: './src/pageTwo/index.js',
    pageThree: './src/pageThree/index.js'
  }
};

上記の例では、

属性を使用して webpack にパッケージ化されたファイルの名前とパスを伝えます

output.filenameoutput.pathその他の設定項目

Loaders

この設定項目の目的は、webpack があなたのファイルのすべてのコードに注目できるようにすることです。ブラウザではなくプロジェクトを使用します (これは、それらが一緒にパッケージ化されるという意味ではありません)。 webpack は、各ファイル (.css、.html、.scss、.jpg など) をモジュールとして扱います。ただし、webpack は JavaScript しか認識しません。

webpack のローダーは、これらのファイルをモジュールに変換し、依存関係グラフに追加します。

大まかに言うと、Webpack 設定には 2 つの目的があります:

1. 特定のローダーで変換する必要があるファイルを特定します。

2. 変換されたファイルは依存関係グラフに追加できます。

const path = require('path');

module.exports = {
  entry: './path/to/my/entry/file.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'my-first-webpack.bundle.js'
  }
};

上記の設定では、別のモジュールの rulues 属性が定義されています。このモジュールには、test と use の 2 つの属性があります。これにより、webpack に次のものをコンパイルするように指示されます: require() または import ステートメントを使用する場合、パスに .js または .jsx 接尾辞を持つファイルは、babel-loader を使用して変換され、パッケージ化されます。


その他の設定項目

プラグイン

ローダーはファイルごとにのみ変換を実行するため、動作を最適化するためにプラグインが最も一般的に使用されます(ただし、これに限定されません)。また、プラグインの編集またはブロックで機能をカスタマイズできます。パッケージ化されたモジュール 中 (など)。

webpack プラグイン システムは非常に強力でカスタマイズ可能です。


プラグインを使用するには、require() して plugins 配列に追加するだけです。オプションを使用してさらに多くのプラグインをカスタマイズできます。プラグインは構成内でさまざまな目的に複数回使用できるため、新しいインスタンスを作成する必要があります。

const path = require('path');

const config = {
  entry: './path/to/my/entry/file.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'my-first-webpack.bundle.js'
  },
  module: {
    rules: [
      {test: /\.(js|jsx)$/, use: 'babel-loader'}
    ]
  }
};

module.exports = config;

webpack は、すぐに使えるプラグインを多数提供しています。詳細については、プラグイン リストから入手できます。

Webpack 構成でプラグインを使用するのは簡単ですが、さらに検討する価値のある使用法がたくさんあります。

その他の設定項目

簡単な例

const HtmlWebpackPlugin = require('html-webpack-plugin'); //installed via npm
const webpack = require('webpack'); //to access built-in plugins
const path = require('path');

const config = {
  entry: './path/to/my/entry/file.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'my-first-webpack.bundle.js'
  },
  module: {
    rules: [
      {test: /\.txt$/, use: 'raw-loader'}
    ]
  },
  plugins: [
    new webpack.optimize.UglifyJsPlugin(),
    new HtmlWebpackPlugin({template: './src/index.html'})
  ]
};

module.exports = config;

以上がWebpack パッケージャーの簡単な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。