美文网首页前端开发那些事儿
我的webpack学习笔记,标注很详细(源文件见文后)

我的webpack学习笔记,标注很详细(源文件见文后)

作者: 不忘初心_d | 来源:发表于2021-03-04 17:57 被阅读0次

一、webpack安装

全局安装:npm i webpack webpack-cli -g

本地安装:npm i webpack webpack-cli -D

二、webpack使用和配置:

1、新建项目名称--根目录新建src目录、build目录、webpack.config.js;
2、src目录新建index.js文件
3、项目根目录执行 npm init 初始化项目;
4、根目录安装 npm i webpack webpack-cli -D
5、在webpack.config.js进行webpack 配置:(不是固定的、可根据不同需求增删相应配置)

const {
  resolve
} = require('path');
const webpack = require('webpack');
const htmlWebpackPlugin = require('html-webpack-plugin'); //解析编译html文件
const miniCssExtractPlugin = require('mini-css-extract-plugin'); //提取css样式文件为单独的文件,减少打包后js代码体积
const {
  loader
} = require('mini-css-extract-plugin');
const addAssetHtmlWebpackPlugin = require('add-asset-html-webpack-plugin');
const optimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin'); //压缩css文件

const commCssLoader = [
  // 'style-loader',//创建style标签,放入样式,就是行内样式
  miniCssExtractPlugin.loader, //取代style-loader 到提取js中css代码为单独文件
  'css-loader', //编译css文件 将css文件整合到js文件中
  /*
  css的兼容性处理:postcss-loader  postcss-preset-env
  帮助 postcss找到package.json中browserslist里面的配置,通过匹配加载指定的css兼容性样式
  */
  { //修改配置 使用postcss-loader默认配置,需要修改配置按照以下去写
    loader: 'postcss-loader',
    options: {
      ident: 'postcss',
      plugins: () => [
        //postcss的插件
        require('postcss-preset-env')()
      ]
    }
  }
];

// process.env.NODE_ENV = 'development'; //设置nodejs环境变量   node默认是生产环境 这个和下面的mode无关

module.exports = {
  //入口起点
  entry: './src/index.js',
  //输出
  output: {
    publicPath: "/",
    filename: 'js/[name].js', //输出文件名
    path: resolve(__dirname, 'build') //输出路径 __dirname 是node.js 文件变量  代表当前文件目录绝对路径
  },

  // loader的配置,用于对模块的源代码进行转换, 可以使你在 import 或 "load(加载)" 模块时预处理文件
  module: {
    // 详细loader的配置,不同的文件需要配置不同的loader
    rules: [
      //处理css
      {
        test: /\.css$/,
        use: [...commCssLoader]
      },
      //处理less
      {
        test: /\.less$/,
        use: [
          ...commCssLoader,
          'less-loader'
        ]
      },
      // 处理css里面图片:需要安装:url-loader 和 file-loader;问题:默认无法处理html中的img图片
      {
        test: /\.(jpg|png|gif)$/, //处理jpg|png|gif等类型格式的图片
        loader: 'url-loader', //使用一个loader也可以这样写,不要use,直接:loader:'url-loader
        options: {
          limit: 20 * 1024, //8*1024是指图片大小小于8kb,就会被转换base64处理,转换base64优点:减少请求次数,减轻服务器压力,缺点:图片体积会更大
          esModule: false, // 解决:关闭url-loader的es6模块化,使用commonjs解析,否则图片无法正常解析
          name: '[hash:10].[ext]', //给编译后的图片重命名--这个配置不是必要的
          outputPath: 'img' //配置输入到指定目录名称
        }
      },
      //处理html文件中的img图片(负责引入img,从而能被url-loader进行处理)
      {
        test: /\.html$/, //需要安装 html-loader
        loader: 'html-loader', //处理html文件中img图片,(负责引入img,从而可以被url-loader进行处理)
        options: {
          esModule: false
        }
      },
      // 处理其他资源,即:除了 js/img/html/css
      {
        // exclude: /\.(css|js|less|html|img|png|scss)$/, //exclude排除法
        test: /\.(eot|svg|ttf|woff|woff2)$/,
        loader: 'file-loader',
        options: {
          outputPath: 'icon'
        }
      },
      //对js兼容性处理 安装插件:cnpm  i babel-loader core-js  @babel/preset-env -D
      {
        test: /\.js$/,
        exclude: /node_modules/, //排除node_modules
        loader: 'babel-loader',
        options: {
          presets: [
            [
              '@babel/preset-env',
              {
                useBuiltIns: "entry", //按需加载
                corejs: 3,
                //targets指定兼容性做到那个版本
                targets: {
                  chrome: '60',
                  firefox: '60',
                  safari: '10',
                  ie: '8',
                  edge: "17"
                }
              }
            ]
          ],
          cacheDirectory: true //开启bable缓存
        }
      }
    ]
  },
  optimization: {
    splitChunks: {
      chunks: "all"
    }
  },
  //plugins的配置,里面写所有用到的插件配置
  plugins: [
    // 详细plugins的配置
    /*
    解析编译html需要下载:
    1、执行C安装 html-webpack-plugin,
    2、引入const htmlWebpackPlugin require('html-webpack-plugin');
    3、plugins里面 new htmlWebpackPlugin();
    作用:html-webpack-plugin功能:默认会创建一个空的HTML文件,自动引入打包输出的所有(JS/CSS)
    */
    new htmlWebpackPlugin({
      template: './src/test.html' //html文件作为模板,自动引入打包输出的所有(JS/CSS)
    }),
    new miniCssExtractPlugin({
      filename: 'css/built.css' //输出文件名 
      // filename: 'css/built.[contenthash:10].css' //[contenthash:10]加哈希值  解决文件缓存后不更新
    }),
    new optimizeCssAssetsWebpackPlugin(),
    new webpack.DllReferencePlugin({ //告诉webpack哪些库不参与打包
      context: __dirname,
      manifest: resolve(__dirname, 'dll/manifest.json')
    }),
    new addAssetHtmlWebpackPlugin({ //将dll已经打包过的文件自动引入
      filepath: resolve(__dirname, 'dll/vendors.js')
    })
  ],
  //环境模式
  mode: 'development',
  // mode: 'production', //默认

  //开发环境配置
  /*
  安装依赖:webpack-dev-server
  开发服务器配置 devServer用来自动化(自动编译,自动打包,自动打开浏览器 自动刷新浏览器)
  启动devServer指令:webpack版本5.0+就执行:webpack serve ;小于5.0就执行:npx webpack-dev-server  
  */
  target: "web",
  devServer: {
    contentBase: resolve(__dirname, 'build'),
    compress: true, //启动zip压缩
    port: 6688,
    open: false, //true自动打开默认浏览器 
    hot: true //热模块替换,只更新相应修改过的模块 提高打包速度
  },
  devtool: 'eval-cheap-module-source-map'
}

源代码和学习笔记 (https://gitee.com/lovegaoxiang/webpack-one)

相关文章

网友评论

    本文标题:我的webpack学习笔记,标注很详细(源文件见文后)

    本文链接:https://www.haomeiwen.com/subject/ixmkqltx.html