webpack的学习

webpack

遇到的问题:

  1. 如何全局引入less
    vue-cli里面的globalVar不知道为啥,我引用不了,只能使用这个。
    在这里插入图片描述

webpack使用的插件

  1. eslint-webpack-plugin(实现eslint校验)
  2. html-webpack-plugin(自动在html中生成main.js文件)
  3. mini-css-extract-plugin(是为了防止闪屏,简而言之就是css文件的解析不会在js文件之后再解析)
  4. css-minimizer-webpack-plugin(是为了解压css文件)
  5. webpack-parallel-uglify-plugin(提高打包速度的插件)
  6. webpack-bundle-analyzer(实现每段内容所加载的时间)

基础篇

*webpack常用的配置
*development模式下的配置
*production模式下的配置

高级篇

*devtool(实现编译之后也还能看到原代码)
*oneOf
*include/exclude
*cache
*Thead
*babel中辅助代码

我们平时使用的es6,promise函数等操作,有时候浏览器并不能识别,这时候通过webpack打包工具解析成浏览器可以识别的东西。

  • 通常面对小图片的时候,我们可以将其转化为base64,减少网络请求。(快了很多) 写在background-image下,转化为base64
  • 在vue项目中配置webpack的时候,首先是在vue.config.js中配置webpack,同时在配置之前,首先应该添加configureWebpack,然后在按照webpack文档来依次配置。
module.exports = {
//	配置webpack
  configureWebpack: {
    module: {
      rules: [
        {
          test: /\.png$/,
          type: 'asset',
          parser: {
            dataUrlCondition: {
              maxSize: 4 * 1024 // 4kb
            }
          }
        }
      ]
    }
  }
}
  1. 通过babel将es6语法打包直接转换为可以兼容浏览器的语法。
development模式下的配置

webpack常用的配置

webpack只可以解析js,json文件。
入口地方

  1. entry(需要解析需要解析的内容,将es6语法转化为浏览器可以解析的内容)
    输出地方
  2. output(1.path:解析目标的文件夹;2.filename:存放js文件的地方;3.clean:每次解析后自动更新文件夹里面的内容。
    加载器
  3. module(rules(数组规则):(1.test:需要测试的文件后缀名是什么。2.use:需要用到的是什么包(执行是从右到左)。
    插件
  4. plugins(需要用到的插件是什么.)
    模式
  5. mode(开发的模式什么,一个是development(开发),一个是production(生产))
    服务器
  6. devServer(服务器的配置,vue在这里可以配置跨域的问题,同时也可以设置自动打开的功能。)
    代码部分
//development模式下配置的部分配置项。
// serve启动devServer配置,实现自动更新,--config是文件夹名字
// npx webpack serve --config 文件名是啥
const path = require("path");
// eslint语法插件的引入
const ESLintPlugin = require("eslint-webpack-plugin");
// 自动打包生成html文件(解决js文件更新的问题)
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
  // 入口(相对路径)
  entry: "./src/js/main.js",
  // 输出
  output: {
    // 输出路径(绝对路径)(文件名默认dist)
    path:undefined,
    // js文件夹中放js文件
    filename: "js/main.js",
    //images文件夹中放图片路径(保留10位长度图片)
    // assetModuleFilename:'images/[hash:10][ext][query]',
    // 自动清空上次打包结果
    clean: true,
  },
  // 加载器(实现对除了js,json文件外的所有文件进行编译,比如css等)
  module: {
    rules: [
      // css转换
      {
        test: /\.css$/,
        // 执行顺序是从右到左
        use: ["style-loader", "css-loader"],
      },
      // less转换
      {
        test: /\.less$/,
        use: ["style-loader", "css-loader", "less-loader"],
      },
      // 当图片小于10kb的时候转化为base64
      {
        test: /\.(png|jpe?g|bmp|gif)/,
        type: "asset", //会转base64
        parser: {
          dataUrlCondition: {
            maxSize: 4 * 1024, // 4kb
          },
        },
        //生成文件的地方
        generator: {
          filename: "static/images/[hash][ext][query]",
        },
      },
      // 把这些后缀名放到一个指定的文件夹里面
      {
        test: /\.(ttf|woff2|woff)$/,
        type: "asset/resource",
        //生成文件的地方
        generator: {
          filename: "static/fonts/[hash][ext][query]",
        },
      },
    ],
  },
  // 插件
  plugins: [
    //都是相对路径
    new ESLintPlugin({
      // 指定需要校验的地方
      context: path.resolve(__dirname, "./src"),
    }),
    //自动添加js文件
    new HtmlWebpackPlugin({
      template: "./public/index.html",
    }),
  ],
  //服务器
  devServer:{
    host:'localhost',
    port:'8080',
    open:true
  },
  // 开发模式(开发模式:development,生产模式:production)
  mode: "development",
};
production模式
  1. 文件压缩(压缩css文件)
  2. css样式的兼容性(需要兼容的内容写在"browserslist"数组中)
  3. 小图片转换为base64
  4. 安装打包加速的插件
  5. html和js文件是自动压缩
//development模式下配置的部分配置项。
// serve启动devServer配置,实现自动更新,--config是文件夹名字
// npx webpack serve --config 文件名是啥
const path = require("path");
// eslint语法插件的引入
const ESLintPlugin = require("eslint-webpack-plugin");
// 自动打包生成html文件(解决js文件更新的问题)
const HtmlWebpackPlugin = require("html-webpack-plugin");
// 每次解析都是先是js然后才是css或者less文件,这时候可以使用新的插件,实现各忙各的同时加载。
//实现防止闪屏
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
//压缩文件
const CssMinimizerPlugin  = require('css-minimizer-webpack-plugin')
module.exports = {
  // 入口(相对路径)
  entry: "./src/js/main.js",
  // 输出
  output: {
    // 输出路径(绝对路径)(文件名默认dist)
    path: path.resolve(__dirname, "../dist"),
    // js文件夹中放js文件
    filename: "js/bundle.js",
    //images文件夹中放图片路径(保留10位长度图片)
    // assetModuleFilename:'images/[hash:10][ext][query]',
    // 自动清空上次打包结果
    clean: true,
  },
  // 加载器(实现对除了js,json文件外的所有文件进行编译,比如css等)
  module: {
    rules: [
      // css转换
      {
        test: /\.css$/,
        // 执行顺序是从右到左
        //原先是style.loader
        use: [
          //实现css文件解析与js同步。
          MiniCssExtractPlugin.loader,
          "css-loader",
          //解决css兼容性的问题
          {
            loader: "postcss-loader",
            options: {
              postcssOptions: {
                plugins: [
                  "postcss-preset-env", // 能解决大多数样式兼容性问题
                ],
              },
            },
          },
        ],
      },
      // less转换
      {
        test: /\.less$/,
        use: [
          MiniCssExtractPlugin.loader,
          "css-loader",
          "less-loader",
          {
            loader: "postcss-loader",
            options: {
              postcssOptions: {
                plugins: [
                  "postcss-preset-env", // 能解决大多数样式兼容性问题
                ],
              },
            },
          },
        ],
      },
      // 当图片小于10kb的时候转化为base64
      {
        test: /\.(png|jpe?g|bmp|gif)/,
        type: "asset", //会转base64
        parser: {
          dataUrlCondition: {
            maxSize: 4 * 1024, // 4kb
          },
        },
        //生成文件的地方
        generator: {
          filename: "static/images/[hash][ext][query]",
        },
      },
      // 把这些后缀名放到一个指定的文件夹里面
      {
        test: /\.(ttf|woff2|woff)$/,
        type: "asset/resource",
        //生成文件的地方
        generator: {
          filename: "static/fonts/[hash][ext][query]",
        },
      },
    ],
  },
  // 插件
  plugins: [
    //都是相对路径
    new ESLintPlugin({
      // 指定需要校验的地方
      context: path.resolve(__dirname, "./src"),
    }),
    //自动添加js文件
    new HtmlWebpackPlugin({
      template: "./public/index.html",
    }),
    //实现css与js隔离开,各自加载各自的.
    new MiniCssExtractPlugin({
      filename: "static/css/main.css",
    }),
  ],
  // 开发模式(开发模式:development,生产模式:production)
  mode: "production",
};

devtool

这样设置的话,可以直接看到编译之前错误的代码位置,缺点就是生产模式下,速度太慢,尽量别用。

//使得错误的显示地方不是编译之后的位置,而是原先自己代码的位置
//(development模式下)
devtool:'cheap-module-source-map'
// (production模式下)
// devtool:'source-map'

oneOf

比如寻找后缀名是css,还是less的时候,我们会都遍历一遍,如果通过这个的话,找到一个后缀名的时候,就停止该文件的寻找,直接进行下一个文件的查找。

module:{
    rules:[
      {
        //每一个文件只能被一个loader匹配,匹配到就不再匹配后面的了。
        oneof:[
          {
            test:/\.css$/,
            use:['style-loader','css-loader'],
           generator:{
              filename:'css/main.css'
            }
          },
          {
            test:/\.less$/,
            use:['style-loader','css-loader','less-loader'],
            generator:{
              filename:'less/main.less'
            }
          },
          {
            test:/\.js$/,
            use:['babel-loader']
          }
        ]
      }
    ]
  },
include/exclude

我们在babel编译js文件的时候,并没有排除node_module文件,也会一并带入,而node_module文件是我们引入的包,也就是并不需要编译他,所以排除他,就可以提高我们的打包速度。

eslint当中也可以排除这个。

{
test:/\.js$/,
 use:['babel-loader'],
  //js文件下写。
 //两个只需要写一个就可以,否则报错。
 //exclude:/node_modules/,//排除node_modules下的文件,其他文件都处理
 include:path.resolve(__dirname,'./src'),  //只处理src里面的文件,其他文件不处理
}
cache
`我们在打包的时候,可以对之前编译的内容进行保存,这样下次就需要再进行这个内容的编译。`

eslint当中也可以用这个。

{
            test:/\.js$/,
            use:['babel-loader'],
            // build中常用。
            options:{
              // 开启babel缓存
              cacheDirectory:true,
              //  关闭缓存文件压缩
              cacheCompression:false
            }
          }

Thead

简而言之就是之前是一个打包东西,但是现在通过这个可以进行多人的进行该内容的打包编译,缺点就是你需要多付钱,但是项目大的时候这个很有用。

  1. 先获取自己cpu内核数量
  2. 然后安排干活
  3. 最后开始干活
1.
// nodejs核心模块,直接使用
const os = require("os");
// cpu核数
const threads = os.cpus().length;
//下载包
npm i thread-loader -D
2.
{
	 test: /\.js$/,
	 use: [
	   {
	     loader: "thread-loader", // 开启多进程
	     options: {
	       workers: threads, // 数量
	     },
	   },
	   {
	     loader: "babel-loader",
	     options: {
	       cacheDirectory: true, // 开启babel编译缓存
	     },
	   },
	 ],
}
3.
optimization: {
   minimize: true,
   minimizer: [
     // css压缩也可以写到optimization.minimizer里面,效果一样的
     new CssMinimizerPlugin(),
     // 当生产模式会默认开启TerserPlugin,但是我们需要进行其他配置,就要重新写了
     new TerserPlugin({
       parallel: threads // 开启多进程
     })
   ],
 },

Thead

在这里插入图片描述

Webpack是一个强大的模块打包工具,它主要用于现代JavaScript应用的静态资源管理和优化。学习Webpack可以按照以下思维导图进行: 1. **基础概念** - 安装与配置:理解Webpack的基本安装过程,如npm安装、配置文件(webpack.config.js)的结构。 - 工作原理:模块解析、加载器(loader)、插件系统等核心组件。 2. **模块管理** - 输入与输出:Webpack如何处理模块的输入路径和输出路径。 - CommonJS & ES6模块化:熟悉CommonJS和ES6模块的区别及Webpack对它们的支持。 3. **打包流程** - 静态分析:了解Webpack是如何构建依赖树的。 - 缓存机制:认识Webpack的缓存策略,提高构建速度。 4. ** loader 技术** - 转换器:解释如何使用loaders转换各种文件类型,如CSS预处理器、图片压缩等。 - 自定义loader:如果需要,学习如何创建自定义loader来处理特定需求。 5. **优化与性能** - UglifyJS、terser:学习如何压缩代码以减小体积。 - SplitChunksPlugin:理解代码分割和懒加载的优化技术。 6. **常见插件** - HtmlWebpackPlugin:生成HTML模板并自动注入打包后的JS和CSS。 - MiniCssExtractPlugin:分离CSS到单独文件。 7. **高级主题** - HMR(热更新):实时刷新模块变化。 - tree-shaking:移除未使用的代码。 8. **实践项目**:通过实际搭建项目来巩固所学知识,例如React、Vue等框架的前端项目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值