Webpack学习笔记

webpack:

webpack 是node的第三方模块包,用于打包代码

webpack是一个现代JavaScript应用程序的静态模块打包器(module bundler)

把很多文件打包整合到一起,缩小项目体积,提高加载速度

功能:

less/sass ------> css

ES6/7/8 -------->ES5

html/css/js------>压缩合并

基础使用:

默认的入口文件 ./src/index.js 默认出口文件 ./dist/main.js

  • 初始化环境

    yarn init

  • 安装依赖包

    yarn add webpack webpack-cli -D

  • package.json配置scripts(自定义命令)

    "scripts": {
    "build": "webpack"
    },

  • 项目目录下新建src/add/index.js

    export const addFn = (a, b) => a + b

  • 项目目录下新建 src/index.js

    import { addFn } from './add'
    console.log(addFn(4, 5))

  • 项目目录下打开命令窗口,运行打包命令

    yarn build
    or
    npm run build

**总结:**打包命令执行后,在项目目录下生成默认的dist目录和打包后默认的main.js文件

  • 代码变更,重新打包

    • 新建src/tool/index.js

      export const getArrSum = (arr) =>
        arr.reducw((sum, val) => {
          sum += val
        }, 0)
      
    • 更改src/index.js代码

      import { addFn } from './add'
      import { getArrSum } from './tool'
      console.log(addFn(4, 5))
      console.log(getArrSum([1, 2, 3, 4]))
      console.log(addFn(5, 6))
      
    • 运行打包命令

      yarn build
      

      **总结:**打包后,代码压缩,变量压缩

webpack配置:

如何指定webpack的入口和出口:

  • 项目目录下,新建webpack.config.js

  • 填写配置项

    const path = require('path')

    module.exports = {
    entry: './src/main.js', // 入口路径
    output: {
    path: path.resolve(__dirname, 'dist'), // 出口路径为绝对路径+dist文件夹
    filename: 'build.js', // 创建的出口文件名称
    },
    }

打包隔行变色项目:

  • 前面的步骤

  • 下载jquery,项目目录下新建public/index.html

  • src/main.js

    import { addFn } from './add'
    import { getArrSum } from './tool'
    import $ from 'jquery'
    console.log(addFn(4, 5))
    console.log(getArrSum([1, 2, 3, 4]))
    console.log(addFn(5, 6))
    $(function () {
    $('#app li:nth-child(odd)').css('color', 'red')
    $('#app li:nth-child(even)').css('color', 'blue')
    })

  • 执行打包命令

  • 把public以及他的html文件复制到dist目录下

  • 在index.html文件中手动引入打包后的build.js

自动生成html文件:

webpack只能打包js文件,插件HtmlWebpackPlugin 简化了 HTML 文件的创建

该插件将为你生成一个 HTML5 文件, 在 body 中使用 script 标签引入你所有 webpack 生成的 bundle

  • 安装:

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

  • webpack.config.js中配置

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

    module.exports = {
    entry: './src/main.js',
    output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'build.js',
    },
    plugins: [new HtmlWebpackPlugin()],
    }

打包后,dist目录下就多了html文件,还自动把打包的build.js文件通过script引入

处理css文件--加载器:

webpack 默认只认识js文件和json文件

  • src/css/index.css给body添加背景颜色

  • 把css文件引入到入口文件 被webpack打包

  • loader加载器,让webpack处理其他类型的文件,打包到js中

  • 安装

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

  • webpack配置

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

    module.exports = {
    entry: './src/main.js',
    output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'build.js',
    },
    plugins: [new HtmlWebpackPlugin()],
    module: {
    rules: [
    //loader的规则
    {
    test: /.css$/i, //匹配所有的css文件
    // use数组中从右往左运行
    // 先用css-loader让webpack识别css文件的内容打包
    // style-loader 把css插入到dom中
    use: ['style-loader', 'css-loader'],
    },
    ],
    },
    }

处理less文件:

  • 安装

    npm install less less-loader --save-dev

  • webpack配置

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

    module.exports = {
    entry: './src/main.js',
    output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'build.js',
    },
    plugins: [new HtmlWebpackPlugin({
    // 以此为标准 生成打包后的html文件
    template: './public/index.html',
    })],
    module: {
    rules: [
    //loader的规则
    {
    test: /.css/i, //匹配所有的css文件 // use数组中从右往左运行 // 先用css-loader让webpack识别css文件的内容打包 // style-loader 把css插入到dom中 use: ['style-loader', 'css-loader'], }, { test: /\.less/i, //匹配所有的less文件
    use: [
    // 从右往左运行
    // compiles Less to CSS
    // less-loader让webpack处理less文件,会用less翻译less代码转换成css代码
    'style-loader',
    'css-loader',
    'less-loader',
    ],
    },
    ],
    },
    }

  • src目录下新建less/index.less

  • 入口main.js中引入less文件

  • 打包

指定生成导入的html文件路径:

webpack配置文件中添加

JavaScript 复制代码
plugins: [
    new HtmlWebpackPlugin({
        // 以此为标准 生成打包后的html文件
        template: './public/index.html',
    }),
],
javascript 复制代码
const HtmlWebpackPlugin = require('html-webpack-plugin')
const path = require('path')

module.exports = {
    entry: './src/main.js',
    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'build.js',
    },
    plugins: [
        new HtmlWebpackPlugin({
            // 以此为标准 生成打包后的html文件
            template: './public/index.html',
        }),
    ],
    module: {
        rules: [
            //loader的规则
            {
                test: /\.css$/i, //匹配所有的css文件
                // use数组中从右往左运行
                // 先用css-loader让webpack识别css文件的内容打包
                // style-loader 把css插入到dom中
                use: ['style-loader', 'css-loader'],
            },
            {
                test: /\.less$/i, //匹配所有的less文件
                use: [
                    // 从右往左运行
                    // compiles Less to CSS
                    // less-loader让webpack处理less文件,会用less翻译less代码转换成css代码
                    'style-loader',
                    'css-loader',
                    'less-loader',
                ],
            },
        ],
    },
}

从yarn build开始,都走了哪些流程:

执行webpack命令,找到配置文件,入口和依赖关系,打包代码输出到指定位置

webpack处理图片文件:

webpack无法自己处理图片文件

webpack5使用asset module技术来实现字体文件和图片文件的处理,无需配置额外的loader

https://webpack.docschina.org/guides/asset-modules/

1:webpack5.在rules里,针对图片文件设置type:asset

2:小于8kb转base64字符串进js里,大于8kb输出文件

  • 在src/assets准备图片文件

  • 在less/aa.less文件中对body设置背景图片

  • 在入口导入图片文件,设置到img标签插入到body

  • 打包

    module:{
    rules:[
    {
    // 图片文件的配置 (仅适用于webpack5版本)
    test: /.(gif|png|jpg|jpeg)/,
    type: 'asset', //匹配上面的文件后,webpack会把他们当静态资源处理打包
    // 如果你设置的asset模式 以8kb来区分图片文件
    // 小于8kb的 把图片文件转base64,打包到js中
    // 大于8kb的,直接把图片文件输出到dist下
    },
    ]
    }

为什么8kb上下的图片要区分:

图片翻译成base64打包到js文件中

好处:浏览器不用法请求了,直接可以读取,速度快

坏处:图片太大,再转base64就会让图片的体积增大30%左右,得不偿失

webpack处理字体图标:

  • src/assets中放入fonts字体相关的文件夹

  • src/main.js引入assets/font/iconfont.css

  • src/main.js创建一个i标签,把字体图标标签添加到body上

  • 添加针对字体文件的加载器规则,使用asset/resource (直接输出文件并配置路径)

  • 打包

    module:{
    rules:[
    {
    test: /.(ttf|eot|svg|woff|woff2)/,
    type: 'asset/resource',
    generator: {
    // 生成文件的文字 定义规则
    filename: 'fonts/[name].[hash:6][ext]', //[ext] 会替换成.eot/.woff
    },
    },
    ]
    }

    webpack对js语法降级

    babel https://www.babeljs.cn/

    babel-loader https://v4.webpack.js.org/loaders/babel-loader/

    babel一个JavaScript编译器,把高版本js语法降级处理输出兼容的低版本语法

    babel-loader 让webpack编译打包js代码

    步骤:

    • src/main.js 定义箭头函数,打印箭头函数变量(不要调用,为 了让webpack打包函数,看降级效果)

    • 下载加载器

npm install -D babel-loader @babel/core @babel/preset-env webpack

- webpack配置

- 打包
JavaScript 复制代码
{
    test: /\.m?js$/,
        exclude: /(node_modules|bower_components)/, //不去匹配这些文件夹下的文件
            use: {
                loader: 'babel-loader', //使用这个loader处理js文件
                    options: {
                        //加载器选项
                        presets: ['@babel/preset-env'], // @babel/preset-env 降级规则  按照这里的规则降级我们的js语法
                    },
                    },
            },

webpack开发服务器:

#### webpack开发服务器

问题:每次修改完代码,重新yarn build打包,才能看到最新效果,实际工作中,打包yarn build非常耗时

为什么:

- 从0构建依赖
- 磁盘读取对应的文件到内存,webpack开始加载
- 再用对应的loader进行处理
- 将处理完的内容,输出到磁盘指定目录

解决:

**起一个开发服务器,缓存一些已经打包过的内容,只重新打包修改的文件,最终运行在内存中给浏览器使用**

打包在内存中,速度快

自动更新打包变化的代码,实时返回给浏览器显示

###### 使用

webpack-dev-server

https://webpack.docschina.org/api/webpack-dev-server/#root

- 下载

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

- 自定义webpack开发服务器启动命令serve 在package.json里

"scripts": {
      "build": "webpack",
      "serve": "webpack serve"
    },
设置开发环境:
mode: 'development', //设置开发环境还是生产环境
启动服务器:
yarn serve


  **webpack-dev-server 会给我们一个地址+端口号 ,浏览器中访问就可以看到打包的index.html页面**

###### 修改端口号

webpack.config.js中修改端口号,重新启动项目

module.exports = {
 mode: 'development',
  devServer: {
    port: 3000,
  },
 }

webpack-dev-server

- 自定义webpack开发服务器启动命令serve 在package.json里

"scripts": {
      "build": "webpack",
      "serve": "webpack serve"
    },
设置开发环境:
mode: 'development', //设置开发环境还是生产环境
启动服务器:
yarn serve


  **webpack-dev-server 会给我们一个地址+端口号 ,浏览器中访问就可以看到打包的index.html页面**

###### 修改端口号

webpack.config.js中修改端口号,重新启动项目

module.exports = {
 mode: 'development',
  devServer: {
    port: 3000,
  },
 }
相关推荐
汤姆和杰瑞在瑞士吃糯米粑粑3 分钟前
【C++学习篇】AVL树
开发语言·c++·学习
虾球xz15 分钟前
游戏引擎学习第58天
学习·游戏引擎
LuH112424 分钟前
【论文阅读笔记】Scalable, Detailed and Mask-Free Universal Photometric Stereo
论文阅读·笔记
奶香臭豆腐1 小时前
C++ —— 模板类具体化
开发语言·c++·学习
波音彬要多做2 小时前
41 stack类与queue类
开发语言·数据结构·c++·学习·算法
m0_748256782 小时前
WebGIS实战开源项目:智慧机场三维可视化(学习笔记)
笔记·学习·开源
红色的山茶花2 小时前
YOLOv9-0.1部分代码阅读笔记-loss.py
笔记
南七澄江4 小时前
各种网站(学习资源及其他)
开发语言·网络·python·深度学习·学习·机器学习·ai
胡西风_foxww5 小时前
【es6复习笔记】Promise对象详解(12)
javascript·笔记·es6·promise·异步·回调·地狱
机智的叉烧9 小时前
前沿重器[57] | sigir24:大模型推荐系统的文本ID对齐学习
人工智能·学习·机器学习