webpack 配置文件

80 阅读1分钟
// webpack.config.js
/* 
loader: 下载->使用
plugin: 下载->引入->使用
*/
// resolve用来拼接绝对路径
const { resolve } = require('path');

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

module.exports = {
  // 入口起点
  entry: './src/index.js',

  // 输出
  output: {
    // 文件名
    filename: 'js/built.js',
    // __dirname node.js的变量,代表当前文件目录的绝对路径
    path: resolve(__dirname, 'build'),
  },

  // loader
  module: {
    rules: [
      // 详细loader配置
      {
        // 匹配哪些文件
        test: /\.css$/,
        // 使用哪些loader处理。use中执行顺序是倒序
        use: [
          // 创建style标签,将js中的样式资源插入进行,添加到head中生效
          'style-loader',
          // 将css文件变成commonjs模块加载到js中,里面内容是样式字符串
          'css-loader',
          // 将less文件编译成css文件
          'less-loader',
        ]
      },
      {
        test: /\.less$/,
        use: [
          'style-loader',
          'css-loader',
          // 将less文件编译成css文件。需要下载less-loader和less
          'less-loader',
        ]
      },
      {
        // 问题: 默认处理不了html中img图片
        test: /\.(jpg|png|gif)$/,
        // 需要下载url-loader、file-loader
        loader: 'url-loader',
        options: {
          // 图片大小小于8kb,就会被base64处理
          // 优点:减少请求数量,减轻服务器压力
          // 缺点:图片体积更大,文件请求速度更慢
          limit: 8*1024,
          // 问题:url-loader默认用es6模块化解析,而html-loader引入图片时commonjs
          // 解析时会出问题:[object Module]
          // 解决:关闭url-loader的es6模块化,使用commonjs解析
          esModule: false,
          // 给图片重命名:取图片的hash前10位,取文件原来的扩展名
          name: '[hash:10].[ext]',
          // 输出到imgs文件夹下
          outputPath: 'imgs'
        }
      },
      {
        test: /\.html$/,
        // 处理html文件的img图片:负责引入img,从而能被url-loader处理
        loader: 'html-loader'
      },
      {
        // 打包 除了css、js、html资源以外的资源,如icon-font
        exclude: /\.(css|js|html|less|jpg|png|gif)$/,
        loader: 'file-loader',
        options: {
          name: '[hash:10].[ext]',
          outputPath: 'media'
        }
      }
    ]
  },

  plugins: [
    // 功能:默认创建一个空的HTML,自动引入打包输出的所有资源(js/css)
    // 需求:需要有结构的html文件
    new HtmlWebpackPlugin({
      // 复制index.html文件,并自动引入打包输出的所有资源(js/css)
      template: './src/index.html'
    })
  ],

  mode: 'development',
  // mode: 'production',

  // 开发服务器 devServer:用来自动化(自动编译、自动打开浏览器、自动刷新浏览器)
  // 特点:只会在内存中编译打包,不会有任何输出。使用webpack指令时,编译打包后会有输出。
  // 启动devServer指令为: npx webpack-dev-server
  devServer: {
    // 项目构建后路径
    contentBase: resolve(__dirname, 'build'),
    // 启动gzip压缩
    compress: true,
    port: 3000,  // 端口号
    open: true,  // 自动打开浏览器
  }
}