我的webpack进化史-基础篇

346 阅读4分钟

先来一些我的碎碎念吧!毕业到现在也一年了,写了很多项目,vue的,react的都有,但都是速成框架,站在前辈大佬的肩膀上,吭呲吭呲的写业务。写业务写到后期很迷茫,每天都是这些业务变来变去。关于webpack这一块的问题除了稍稍优化下,也没有碰到过,直到看了呆呆大佬的面试文章,我感觉要自闭了,10个问题9个说不明白。于是痛下决心要开始学习,先从webpack开始,一步一个脚印搞懂来。文章不会写的很难,毕竟我的肚子里也没几点墨水,就记录我学习webpack过程中出现的bug。期间如果会出现小白问题,若有大佬路过,请指出!!!!!

webpack到底是如何对我们的项目打包?

这个问题网上找一大堆解答的,我就直接网上找了张图,看图就能很清楚的明白。webpack在处理的时候,他首先是根据我们的配置文件来找到入口的。从入口开始,生成一个依赖图,这个依赖图包括应用程序中所需的所有模块,然后在遍历图结构,打包一个个模块,不同的文件就使用不同的loader来解析

image.png

首先第一步就是把我们项目初始化!

mkdir webpack-test
cd webpack-test
npm init -y

然后在安装webpack webpack-cli 可能很多人会问(其实我自己刚开始也不知道,哈哈哈哈)webpack webpack-cli有啥区别,webpack-cli是webpack脚手架,这样我们就可以直接在终端用webpack命令啦
npm install webpack webpack-cli

在package.json里添加一条命令
"build": "webpack --config webpack.config.js",


image.png

第一趴webpack基础构建主要是三个部分

1. 加载css
主要是说明我们在项目中的css在webpack中是如何进行转换?
style-loader和css-loader是如何工作的?
为什么css的转换必须要两个loader?
为什么style-loader必须在css-loader前面?
css在不同网站是有兼容性问题的,怎样才可以避免我每次写css都要写很多拓展兼容各个浏览器的css样式,postcss-loader该怎么用?
我项目中用了scss,less,我该怎么配置?
2. 加载图片
项目中的图片在webpack中要如何配置才能加载?
如何把项目中所有的图片在打包之后在dist文件夹中都配置到同一个文件下?
3. 配置插件
每次打包都需要手动添加index.html,怎么样才可以在打包之后不用在dist包中手动添加html?
如果我有自定义的index.html模版,我要如何配置?
我不想每次打包之前都手动删除之前遗留的dist包?我想要配置多个输入输出我该怎么做?

所有的答案我都在代码里写了注释,跟着代码一步一步的敲就可以啦!

webpack.config.js

const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const { CleanWebpackPlugin } = require('clean-webpack-plugin')

module.exports = {
  /**
   * 多个输出/输入
   */
  // entry: './src/index.js',
  // output: {
  //   filename: 'vender.js',
  //   path: path.resolve(__dirname, 'dist')
  // },
  entry: {
    app: './src/index.js',
    print: './src/print.js'
  },
  output: {
    filename: '[name].vender.js',
    path: path.resolve(__dirname, 'dist')
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        /**
         * 注:加载css
         * style-laoder是要放到css-loader前面,不然打包会出现错误
         * 这是因为loader执行顺序是从右往左,从下往上,webpack肯定是先将所有的css模块依赖解析完得倒计算结果在创建style标签,因此应该把style-loader放在css-loader的前面
         * 
         * style-loader 他可以创建一个style标签,并且把引入进来的css样式都塞到这个标签里
         * css-loader  他用特定的语法规则对引入进来的css模块进行内容转换,转换出来的css模块其实会拆分成数组,如果单独引入css-loader,是无效的,页面对他转换出来的数组无法识别,
         *             所以需要style-loader把css-loader转换出来的css模块包裹在一个style标签里,引入index.html里的head,这样就可以展示css样式啦!
         */
        use: ['style-loader', 'css-loader', "postcss-loader"]
      },
      {
        test: /\.less$/,
        use: [
          'style-loader', 'css-loader', "postcss-loader", 'less-loader'
        ]
      },
      {
        /**
         * 加载图片
         */
        test: /\.(png|svg|jpg|gif|jpeg)$/,
        use: {
          loader: 'file-loader',
          options: {
            name: '[name].[ext]',
            outputPath: 'images/'
          }
        }
      }
    ]
  },
  plugins: [
    /**
     * 在dish文件夹中自动生成index.html,也可以指定我们自己的模版来生成index.html,这样每次打包就不需要我们再去手动添加index.html
     */
    new HtmlWebpackPlugin({
      title: 'Webpack Output Management',
      filename: 'index.html',
      template: 'public/index.html'
    }),
    /**
     * 每次打包都会自动删除之前存在的dist文件夹
     */
    new CleanWebpackPlugin({
      cleanAfterEveryBuildPatterns: ['dist']
    })

  ]
}

postcss.config.js

module.export = {
  plugins: [
    'postcss-preset-env',
  ]
}

注:解答问题

  1. css模块 PostCSS其实一个对css进行转化的工具,它可以把scss,less转成css,它有非常多的插件,巨好用。比如autoprefixer/postcss-preset-env就可以帮我们自动加上浏览器前缀,比如-webkit-啥啥啥的,再比如postcss-pxtorem就是针对浏览器适配的,可以把px转成rem,还有很多很多,我就不一一列举了,

npm i postcss-loader autoprefixer postcss-pxtorem postcss-preset-env -D

autoprefixer和postcss-preset-env区别

这两个插件都是针对css兼容性,postcss-preset-env她可以根据目标浏览器或者运行时环境添加所需的polyfill,也会自动帮助我们添加postcss-preset-env。它两最大的区别在于postcss-preset-env,如果我们使用十六进制的颜色时只设置了8位,有些浏览器是不认识这种愈发的,我们最好可以转成RGBA的形式。但是autoprefixer不会帮助我们转换,而postcss-preset-env是可以完成这种功能的

项目结构+预览

image.png

image.png

bug集锦

2021-08-05

Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema.

今天的我估计是个傻叉,无奈。第一步就报错,看了报错信息说我写的配置项与webpack初始化的配置对象不匹配,一看才发现,单词写错,真的是猪脑袋🐷

image.png