webpack 学习笔记

白日强 2019-11-04

webpack 学习笔记总结,仅供自己 webpack 学习使用。

安装与初始化

在项目根目录执行命令:

npm init -y
npm install webpack webpack-cli --save-dev

调整 package.json 文件,以便确保我们安装包是 私有的(private),并且移除 main 入口。

+   "private": true,
-   "main": "index.js",

webpackMerge

为每个环境编写彼此独立的 webpack 配置。安装webpack-merge

npm install --save-dev webpack-merge

webpack.common.js

const path = require('path');
module.exports = {
  // 配置内容
};

webpack.dev.js

const merge = require('webpack-merge');
const common = require('./webpack.common.js');
module.exports = merge(common, {
  // 开发环境配置
});

webpack.prod.js

const merge = require('webpack-merge');
const common = require('./webpack.common.js');
module.exports = merge(common, {
  // 生产环境配置
});

入口

entry:起点或是应用程序的起点入口。

webpack.config.js

entry: {
  home: './src/index.js',
}

出口

output :指示 webpack 如何去输出、以及在哪里输出你的 bundle、asset 和其他你所打包或使用 webpack 载入的任何内容。

output.path:output 目录对应一个绝对路径

webpack.config.js

output: {
    path: path.resolve(__dirname, 'dist/assets')
}

output.filename :决定了每个输出 bundle 的名称。

webpack.config.js

output: {
    // 静态名称
    filename: "bundle.js"
    // 入口名称
    filename: "[name].bundle.js"
    // 内部 chunk id
    filename: "[id].bundle.js"
    // 唯一的 hash 生成
    filename: "[name].[hash].bundle.js"
    // 基于每个 chunk 内容的 hash
    filename: "[chunkhash].bundle.js"
}

资源管理

loader:让 webpack 能够去处理那些非 JavaScript 文件。

加载 CSS

安装并添加 style-loadercss-loader

npm install --save-dev style-loader css-loader

webpack.config.js

module: {
  rules: [
    {
      test: /\.css$/,
      use: ['style-loader', 'css-loader'],
    },
  ];
}

加载图片

安装 file-loader

npm install --save-dev file-loader

webpack.config.js

module: {
  rules: [
    {
      test: /\.(png|svg|jpg|gif)$/,
      use: ['file-loader'],
    },
  ];
}

加载字体

安装 file-loader

npm install --save-dev file-loader

webpack.config.js

module: {
  rules: [
    {
      test: /\.(woff|woff2|eot|ttf|otf)$/,
      use: ['file-loader'],
    },
  ];
}

加载数据

安装 csv-loaderxml-loader

npm install --save-dev csv-loader xml-loader

webpack.config.js

module: {
  rules: [
    {
      test: /\.(csv|tsv)$/,
      use: ['csv-loader'],
    },
    {
      test: /\.xml$/,
      use: ['xml-loader'],
    },
  ];
}

babel

安装 babel-loader

npm install --save-dev babel-loader babel-core babel-preset-env
npm install --save-dev babel-plugin-transform-runtime

webpack.config.js

module.exports = {
  module: {
    rules: [
      {
        test: /(\.jsx|\.js)$/
        use: {
          loader: 'babel-loader',
        },
        exclude: /node_modules/
      },
    ],
  },
};

.babelrc

{
  presets: ['@babel/preset-env'],
  plugins: ['@babel/transform-runtime']
}

输出管理

HtmlWebpackPlugin

安装 html-webpack-plugin

npm install --save-dev html-webpack-plugin

webpack.config.js

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

module.exports = {
  plugins: [
    new HtmlWebpackPlugin(),
  ],
};

CleanWebpackPlugin

安装[clean-webpack-plugin]()

npm install --save-dev clean-webpack-plugin

webpack.config.js

const CleanWebpackPlugin = require('clean-webpack-plugin');
module.exports = {
  plugins: [
    new CleanWebpackPlugin(...),
  ],
};

开发环境

sourceMap

JavaScript 提供了 source map 功能,将编译后的代码映射回原始源代码。

webpack.config.js

module.exports = {
  devtool: 'eval-source-map|cheap-eval-source-map|eval|cheap-module-eval-source-map',
};

webpackDevServer

安装 webpack-dev-server

npm install --save-dev webpack-dev-server

devServer 常见配置表

配置选项功能描述
contentBase默认webpack-dev-server会为根文件夹提供本地服务器,如果想为另外一个目录下的文件提供本地服务器,应该在这里设置其所在目录
port设置默认监听端口,默认为”8080“
inline设置为true,当源文件改变时会自动刷新页面
historyApiFallback在开发单页应用时非常有用,它依赖于HTML5 history API,如果设置为true,所有的跳转将指向index.html
compress为所服务的一切启用 gzip 压缩
opendev-server在服务器启动后打开浏览器
hot启用热加载
publicPath此路径下的打包文件可在浏览器中访问

webpack.config.js

module.exports = {
  devServer: {
    hot: true, // 热加载
    inline: true, // 自动刷新
    open: true, // 自动打开浏览器
    historyApiFallback: true,
    host: 'localhost', // 主机名
    port: 3000, // 端口号
    compress: true,
  },

  plugins: [
    // 显示模块相对路径
    new webpack.NamedModulesPlugin(),
    // 启用 HMR
    new webpack.HotModuleReplacementPlugin(),
  ],
};

生产环境

需要优化,压缩,缓存以及分离 CSS 和 JS。

sourceMap

webpack.config.js

module.exports = {
  devtool: 'none|source-map|hidden-source-map|nosources-source-map',
};

MiniCssExtractPlugin

使用 ExtractTextPlugin 将 CSS 分离成单独的文件。

安装 mini-css-extract-plugin

npm install --save-dev mini-css-extract-plugin

webpack.config.js

const MiniCssExtractPlugin = require('mini-css-extract-plugin');

module.exports = {
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          {
            loader: MiniCssExtractPlugin.loader,
            options: {
              // ...
            },
          },
          'css-loader',
        ],
      },
    ],
  },
  plugins: [
    new MiniCssExtractPlugin(options),
  ],
};

CommonsChunkPlugin

CommonsChunkPlugin 插件可以将公共的依赖模块提取到已有的入口 chunk 中,或者提取到一个新生成的 chunk。

webpack.config.js

const webpack = require('webpack');
module.exports = merge(common, {
  plugins: [
    new webpack.optimize.CommonsChunkPlugin({
      name: "commons",
        filename: "commons.js",
    })
  ],
});

相关推荐