webpack基础知识详解

深入探讨Webpack的使用,包括模块化历程、配置与优化技巧。覆盖基础配置、资源加载、插件使用、Vue集成及懒加载策略,助你提升前端工程化水平。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

webpack基础

01-模块化历程

起初,js没有模块化概念,导致出现一些问题:

  • 容易造成变量污染
  • 文件之间的依赖关系模糊

浏览器端模块化:异步模块化规范

  • require.js 是AMD规范 (异步模块化规范) 依赖前置
  • sea.js 说CMD规范(通过模块化规范 异步) 依赖就近

Nodejs模块化:同步模块化规范

  • CommonJS规范
  • 导出:module.exports
  • 导入:require

ES6模块化:同步模块化规范

  • 默认导出 export default
  • 导入 import xxx from ‘xxx’

在浏览器端无法使用,Es6的模块化,需要使用打包工具,将基于Es6的的模块打包在一起。

02-webpack-介绍

本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。

  • webpack是基于Nodejs的命令行工具
  • 默认的作用是打包JS模块资源,不需要对js文件进行导入导出操作
  • 当然配置加载器后,可以打包所有类型的资源文件。
  • 也通过安装插件,可以对输出结果进行修改。
  • 最后可以支持项目开发环境,提供服务器功能(localhost)。

学习目的:

  • 了解webpack这个工具基础使用
  • 基于vue-cli可以自行修改一些默认配置

03-webpack-安装

全局安装:

npm i webpack -g
npm i webpack-cli -g
  • 安装后,可以在全局使用命令 webpack ,但是不建议全局安装,因为各个项目依赖的版本不一样,全局更新后将影响,其他版本的项目。

推荐本地项目单独使用:

注意:本地项目文件夹的命名不可以是webpack或webpacks,否则安装不成功

  1. 初始化项目 配置package.json的文件
npm init -y
  1. 安装 --save-dev 简写 -D 安装到开发依赖
npm i webpack -D
npm i webpack-cli -D
  1. node_modules下配置package.json
{
    "scripts":{
        //"start":"nodemon app.js",
        "build":"webpack"
    }   
}
  1. 调用webpack工具
npm run build

第一次使用webpck打包:必须有src目录,默认入口文件是index.js。

04-webpack-打包模式(mode)

  • 需要在配置文件下进行配置
  • 默认的配置文件名称是:webpack.config.js
module.exports = {
    //development 开发模式打包   代码不压缩,打包速度快 没做优化处理
    //production 生产模式(线上运行)打包 打包速度慢 做了一些优化处理,压缩
    mode: 'development' // 开发模式打包
} 

05-webpack-入口与出口

  • 默认入口是 src下的index.js文件,注意引入时的路径
  • 默认出口是 dist 目录下的 main.js 文件–是一个默认的压缩文件

src/index.js入口文件:

在这里插入图片描述

默认的配置文件是:webpack.config.js

//配置绝对路径
const path = require('path');

module.exports = {
  // 打包的入口文件   默认加载./src/index.js
  entry: './src/index.js',
  // 打包结果的输出的出口文件   文件夹默认生产=成文件夹dist
  output: {
    // 必须指定的是绝对路径
    path: path.join(__dirname, './dist'),
    filename: 'main.js'
  }
};
  • 在命令行中,输入如下,检测是否打包成功
npm run build

06-webpack-打包css

加载css:https://www.webpackjs.com/guides/asset-management/#加载-css

第一步:创建文件 src/index.html,引入main.js文件,

在这里插入图片描述

第二步:创建calc.js功能文件,打开html网页,按F12,可以显示打印出来——30,检测webpack默认打包成功

在这里插入图片描述

应用:打包css文件,并进行页面显示验证

第三步:在src下,创建静态资源文件夹assets,新建src/assets/css/index.css文件

在这里插入图片描述

第四步:模块化开发,让css文件生效,需要在src/index.js入口文件中进行引入

在这里插入图片描述

第五步:webpack.config.js中配置文件,因为webpack默认打包js文件,如果引入其他格式css文件,需要用对于的加载器插件处理该文件,把代码解析成js文件,才可以加载css等格式文件

  • 命令行(开发依赖)中安装css加载包
npm install --save-dev style-loader css-loader
  • webpack.config.js中配置文件
  const path = require('path');

  module.exports = {
    entry: './src/index.js',
    output: {
      filename: 'main.js',
      path: path.resolve(__dirname, 'dist')
    },
    //加载器配置
+   module: {
	  //加载规则
+     rules: [
+       {
		  //加载后缀名.css文件
+         test: /\.css$/,
		  //loader 加载器,解析器
		  //执行按照  从下往上执行
		  //通过css-loader加载了css代码,通过style-loader  把加载代码追加到style标签上进行预览
+         use: [
+           'style-loader',
+           'css-loader'
+         ]
+       }
+     ]
+   }
  };

第七步:命令行中运行代码:

npm run build

第八步:打开html文件,检测css样式是否生效

在这里插入图片描述

webpack配置文件目录如下:

在这里插入图片描述

07-webpack-打包less

应用:打包less文件,并进行页面显示验证

第一步:在src下,创建样式文件夹styles,新建src/styles/index.less文件

在这里插入图片描述

第二步:模块化开发,让less文件生效,需要在src/index.js入口文件中进行引入

在这里插入图片描述

第三步:webpack.config.js中配置文件,因为webpack默认打包js文件,如果引入其他格式less文件,需要用对于的加载器插件处理该文件,把代码解析成js文件,才可以加载less等格式文件

  • 在webpack官网,没有直接less-loader加载器,需要进行输入框关键字“less-loader”搜索,

https://webpack.js.org/loaders/less-loader/#root

在这里插入图片描述

  • 注意:less-loader 依赖 less 的,所以提前在命令行 安装 less 模块。
npm install less-loader --save-dev
  • webpack.config.js中配置文件
const path = require('path')
module.exports = {
  mode: 'development',
  entry: './src/index.js',
  output: {
    path: path.resolve('./dist'),
    filename: 'main.js'
  },
  //加载器配置
  module: {
  	//加载规则
    rules: [
      {
        //加载后缀名.css文件
        test: /\.css$/,
         //loader 加载器,解析器
		  //执行按照  从下往上执行
		  //通过css-loader加载了css代码,通过style-loader  把加载代码追加到style标签上进行预览
        use: [
          'style-loader',
          'css-loader'
        ]
      }, 
      //加载后缀名.less文件
      //less-loader  less解析成css,需要依赖Less核心包
+      {
+        test: /\.less$/,
+        use: [
+          'style-loader',  //3.把css放到节点里面进行编译
+          'css-loader',   //2.加载css
+          'less-loader'   //1.编译less
+        ]
+      }
    ]
  }
}

第四步:安装less核心包

npm install --save-dev less

第五步:命令行中运行代码:

npm run build

第六步:打开html文件,检测less样式是否生效

在这里插入图片描述

注意:

打包less,命令行一共需要安装下面4个包

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

08-webpack-打包图片

第一步:在src/assets下,创建图片文件夹images,新建src/assets/images/logo.png文件

第二步:webpack.config.js中配置文件,因为webpack默认打包js文件,如果引入其他格式图片文件,需要用对应的加载器插件处理该文件,把代码解析成js文件,才可以加载图片等格式文件

https://www.webpackjs.com/guides/asset-management/#加载图片

  • 命令行(开发依赖)中安装图片加载包
npm install --save-dev file-loader
  • webpack.config.js中配置文件
onst path = require('path');

  module.exports = {
    entry: './src/index.js',
    output: {
      filename: 'bundle.js',
      path: path.resolve(__dirname, 'dist')
    },
    module: {
      rules: [
        {
          test: /\.css$/,
          use: [
            'style-loader',
            'css-loader'
          ]
        },
+       {
		   //加载后缀名.png|svg|jpg|gif 等图片格式文件
+         test: /\.(png|svg|jpg|gif)$/,
		  //使用图片加载器  加载图片
+         use: [
+           'file-loader'
+         ]
+       }
      ]
    }
  };

第三步:把图片作为背景图使用,让less文件生效,同样在src/index.js入口文件中进行引入less文件

在这里插入图片描述

第四步:手动修改html文件路径

在这里插入图片描述

第五步:命令行运行代码,图片预览成功

在这里插入图片描述

注意:

此种手动修改index.html文件的路径,非正常操作方式

09-webpack-打包字体文件

第一步:在src/assets下,创建字体文件夹fonts,新建src/assets/fonts/font.ttf文件

第二步:在src/styles/index.less中:

// 定义一个字体
@font-face{
  font-family: "hm-79";    //字体名字
  src: url(../assets/fonts/font.ttf) format('truetype');   //路径和固定格式
}
// 使用这个字体  所有p标签
p{
  font-family: hm-79
}

第三步:在新复制的dist/index.html中,对比字体样式

在这里插入图片描述

第四步:webpack.config.js中配置文件,因为webpack默认打包js文件,如果引入其他格式字体文件,需要用对应的加载器插件处理该文件,把代码解析成js文件,才可以加载图片等格式文件

https://www.webpackjs.com/guides/asset-management/#加载字体

  • 命令行(开发依赖)中安装字体加载包file-loader,打包图片时已安装则忽略
npm install --save-dev file-loader
  • webpack.config.js中配置文件即可
+       {
		  //加载后缀名.woff|woff2|eot|ttf|otf 等字体格式文件
+         test: /\.(woff|woff2|eot|ttf|otf)$/,
		  //使用字体加载器  加载字体
+         use: [
+           'file-loader'
+         ]
+       }

第五步:命令行运行代码,打包

npm run build

打包成功后,dist文件夹下会生成一个字体文件

打开新复制的dist/index.html,验证字体样式对比

在这里插入图片描述

10-webpack-生成html

应用——把外边的模板html代码自动生成到dist目录下

html插件(设定-htmlwebpackplugin)-可以把根目录下的index.html打包到dist目录

https://www.webpackjs.com/guides/output-management/#设定-htmlwebpackplugin

第一步:命令行 安装 打包插件

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

第二步:webpack.config.js中配置文件即可

// 导包   生成html在dist目录下
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
    第三步: //插件配置
+   plugins: [
	  //实例化插件
+     new HtmlWebpackPlugin({
	    //生成后的html的title
+       title: 'Output Management'
+     })
+   ],
  
  };

第四步:命令行运行代码,打包

npm run build

打包成功后,dist文件夹下会生成一个全新的index.html文件

打开新生成的dist/index.html,验证html网页的title是否更新

在这里插入图片描述

注意:

该index.html文件不是复制品,是全新的html页面;

​ 没有把根目录下的index.html中的div和span元素渲染出来

如果你想要了解更多 HtmlWebpackPlugin 插件提供的全部功能和选项,那么你就应该多多熟悉 HtmlWebpackPlugin 仓库。下拉页面,找到Options,在下面找对应的选件属性

使用自己的文件做为模版:

+   plugins: [
+     new HtmlWebpackPlugin({
		//以index.html为模板,在dist下生成index.html
+       template: 'index.html'
+     })
+   ],

第五步:命令行运行代码,打包

npm run build

打包成功后,dist文件夹下会生成一个新的index.html文件,

打开新生成的dist/index.html,验证该html网页是否和根目录下的index.html文件内容一致

在这里插入图片描述

第六步:删除根路径下的index.html文件中手动导入的main.js模块

在这里插入图片描述

第七步:命令行中重新启动,并打开html文件,显示最终页面效果

11-webpack-清理dist

用英文版(指定清理dist)https://webpack.js.org/guides/output-management/#cleaning-up-the-dist-folder

第一步:命令行 安装 打包插件

npm install clean-webpack-plugin --save-dev

第二步:webpack.config.js中配置文件即可

+ const {CleanWebpackPlugin} = require('clean-webpack-plugin');

 plugins: [
+     new CleanWebpackPlugin(),
      new HtmlWebpackPlugin({
        title: 'Output Management'
      })
    ],

 // 导包
  //const CleanWebpackPlugin = require('clean-webpack-plugin');  中文版本
+ const {CleanWebpackPlugin} = require('clean-webpack-plugin');
  module.exports = {
    第三步: //插件配置
+   plugins: [
	  //实例化插件  把目录传进去
     //new CleanWebpackPlugin(['dist']),   会报错
+     new CleanWebpackPlugin(),
     new HtmlWebpackPlugin({
	    //生成后的html的title
      title: 'Output Management'
    })
  ],
  
  };

第四步:命令行运行代码,打包

npm run build

打包成功后,dist文件夹下自动清理无效文件

在这里插入图片描述

12-webpack-babel介绍

13-webpack-babel使用

在webpack官网-搜索关键字 babel-loader

babel-loader加载器插件包:https://webpack.js.org/loaders/babel-loader/#root

第一步:命令行安装包

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

第二步:webpack.config.js中配置文件即可

module: {
  rules: [
    {
      //test 解析ES6语法为ES5语法
      test: /\.m?js$/,
      exclude: /(node_modules|bower_components)/,  //排除   第三方包
      use: {
        loader: 'babel-loader',
        options: {
          presets: ['@babel/preset-env']
        }
      }
    }
  ]
}

第三步:命令行运行代码,打包

npm run build

打包成功后,main.js文件中会看到cost—>var,箭头函数转普通函数等语法;

​ 说明babel插件包,已经验证生效

附:

以上操作是语法解析,但是ES6还更新了一些高阶函数。此时,需要依赖另一个包polyfill

babel官网—>Docs—>polyfill

中文版 https://www.babeljs.cn/docs/babel-polyfill

第四步:命令行 安装polyfill

npm install --save @babel/polyfill

使用:必须优先导入模块,之后的js才可以使用当前模块提供的函数(实现了ES6提供的高阶函数)

第五步:为了支持ES6高阶函数,在src/index.js中首行导入

import "@babel/polyfill";

或者:

module.exports = {
  entry: ["@babel/polyfill", "./src/index.js"],
};

第六步:命令行运行代码,打包

npm run build

打包成功后,命令行中显示main.js的内存增大到456kb左右

14-webpack-sourceMap——为了更容易地追踪代码错误和警告

项目打包后,dist解析的代码位置相较于源代码会发生变化

为了更容易地追踪错误和警告,JavaScript 提供了 source map 功能,将编译后的代码映射回原始源代码。如果一个错误来自于 b.js,source map 就会明确的告诉你。——功能:会记录代码打包后,所在源代码中的位置;发生错误时,会准确显示在第几行

webpack官网—>中文文档—>指南—>开发—>使用source map

https://www.webpackjs.com/guides/development/#使用-source-map

错误冗余代码

在这里插入图片描述

第一步:webpack.config.js中配置文件即可

 //导包
 module.exports = {
    第二步: //插件配置
+  devtool: 'inline-source-map',
    plugins:[
    
    ]
  };

第三步:命令行运行代码,打包

npm run build

打包成功后,打开网页,F12精确显示错误代码具体位置

source-map配置前:

在这里插入图片描述

source-map配置后:

在这里插入图片描述

15-webpack-watch监听——监听到代码变化,自动实现打包

可以指示 webpack “watch” 依赖图中的所有文件以进行更改。如果其中一个文件被更新,代码将被重新编译,所以你不必手动运行整个构建。

  • webpack官网—>中文文档—>指南—>开发—>使用观察模式:

https://www.webpackjs.com/guides/development/#使用观察模式

我们添加一个用于启动 webpack watch mode 的 npm scripts:

在package.json中进行配置:

    "scripts": {
      "test": "echo \"Error: no test specified\" && exit 1",
+     "watch": "webpack --watch",
      "build": "webpack"
    },

配置后,命令会自动监听文件代码的变化,自动完成构建和打包。命令光标不会停,一直闪烁监听文件变化

​ 运行命令更改:npm run build ——> npm run watch

在这里插入图片描述

唯一的缺点是,为了看到修改后的实际效果,你需要刷新浏览器。如果能够自动刷新浏览器就更好了,因此接下来我们会尝试通过 webpack-dev-server 实现此功能。

在这里插入图片描述

16-webpack-dev-server——自动刷新浏览器进行实时的预览

webpack-dev-server 为你提供了一个简单的 web 服务器,并且能够实时重新加载(live reloading),自动刷新浏览器进行实时的预览

https://www.webpackjs.com/guides/development/#使用-webpack-dev-server

第一步:命令行 装包

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

第二步:webpack.config.js中配置文件服务器即可

    //错误追踪
    devtool: 'inline-source-map',
    //服务器配置
+   devServer: {
+     contentBase: './dist'   //指定  服务器 根目录
+   },

第三步:package.json设置启动命令脚本

    "scripts": {
+     "serve": "webpack-dev-server --open",  //启动服务设置  open-自动打开浏览器

第四步:执行:

npm run serve

在这里插入图片描述

修改完代码后,自动打包,自动刷新浏览器

在这里插入图片描述

  • 不会把资源打包到磁盘(dist目录)中,存储在内存中。读取更快。

17-webpack-热更新——浏览器不刷新,更新打包后的结果

  • 实现浏览器不刷新,更新打包后的结果,默认对js不生效,对样式生效。

https://www.webpackjs.com/guides/hot-module-replacement/#启用-hmr

第一步:webpack.config.js中配置文件服务器即可

+ const webpack = require('webpack');

  module.exports = {
    entry: {
-      app: './src/index.js',
-      print: './src/print.js'
+      app: './src/index.js'
    },
    devtool: 'inline-source-map',
    //服务器配置
    devServer: {
      contentBase: './dist',
+     hot: true    //2.开启热更新
    },
    //插件配置
    plugins: [
      new CleanWebpackPlugin(['dist']),
      new HtmlWebpackPlugin({
        title: '模块热替换'
      }),
+     new webpack.HotModuleReplacementPlugin()  //1.热更新模块配置
    ],

第三步:命令行运行代码,打包

npm run serve

打包成功后,打开网页

第四步:修改文件代码后,观看页面刷新按钮,验证热更新效果

在这里插入图片描述

18-webpack-打包vue文件

vue-loader不是webpack提供的,而是vue本身提供的:

Vue Loader 是一个 webpack 的 loader,它允许你以一种名为单文件组件 (SFCs)的格式撰写 Vue 组件:

手动配置vue-loader:

第一步:命令行中 安装vue包

npm i vue

  • 在入口文件index.vue中进行导入

    import Vue from ‘vue’

第二步:新建src/APP.vue文件 1

在这里插入图片描述

第三步:vue组件文件 在 入口文件index.vue中 进行引入 2

在这里插入图片描述

第四步:命令行 安装包

vue-loader:加载vue文件内容 vue-template-compiler:编译成组件配置对象

npm install -D vue-loader vue-template-compiler

第五步:webpack.config.js中进行加载器配置

// 加载vue文件
+  const VueLoaderPlugin = require('vue-loader/lib/plugin')

module.exports = {
  module: {
    rules: [
      // ... 其它规则
+      {
+        test: /\.vue$/,
+        loader: 'vue-loader'
+      }
    ]
  },
  plugins: [
    // 请确保引入这个插件!
+    new VueLoaderPlugin()
  ]
}

第六步:npm run serve 后,页面显示正常,说明 vue-loader 加载器配置成功

第七步:把vue组件 挂载到 html网页上 3

在这里插入图片描述

第八步:在入口文件index.js中 创建vue实例 4

在这里插入图片描述

第九步:命令行运行npm run serve启动服务器后,打开页面,验证vue组件文件在页面是否渲染成功 5

在这里插入图片描述

19-webpack-路径别名——@符设置src下文件的绝对路径

基于webpack,可以使用@符设置src下文件的绝对路径

入口文件index.js修改 vue文件的 绝对路径

在这里插入图片描述

第一步:webpack.config.js中进行加载器配置

  //解析路径
  resolve: {
    //别名
    alias: {
        //resolve 获取绝对路径的API,join也可以获取; @ 也可以用 $,就是个 别名
      '@': path.resolve(__dirname, './src')    // 设置 src的绝对路径 
    }
  },

注意: webpack.config.js修改之后,要重启服务器

第二步:npm run serve ,打开页面验证vue组件内容显示正常

20-webpack-文件后缀——省略.vue等文件后缀,页面同样生效

入口文件index.js删除 APP.vue文件的 后缀名 .vue

在这里插入图片描述

第一步:webpack.config.js中进行加载器配置

 //解析路径
  resolve: {
    alias: {
      '@': path.resolve(__dirname, './src')
    },
    //省略后缀
+    extensions: ['.js', '.vue', '.json', '.css']   //后缀名 可以根据需要自由增减
  },

**注意:**webpack.config.js修改之后,要重启服务器

第二步:npm run serve ,打开页面验证vue组件内容显示正常

21-webpack-打包部署——路由懒加载 解决 首屏加载慢 的问题

路由懒加载 解决 登录页首屏加载慢 的问题

路由懒加载:https://router.vuejs.org/zh/guide/advanced/lazy-loading.html

  • 原因:所有第三包打包在一起,资源体积比较大,会导致资源运行时比较慢

    • echarts包体积比较就比较大,且是局部使用,可以单独进行引入,不需要作为第三方包一起打包
    • 所有的vue组件也是一次性集中访问,导致加载比较慢

在这里插入图片描述

npm run build

首屏加载慢

  • 在显示页面,获取所有的资源

打包后的文件比较大(chunk-vendors第三方包代码合并在一起)(app自己写代码合并在一起

  • 方案:
    • 按需加载需要的资源——就是路由懒加载。
    • 路由懒加载
const Foo = () => import('./Foo.vue')

在打包的时候,对你组件依赖代码进行分割,分块。不会合并在一起后再加载

第一步:对项目的入口文件src/router/index.js进行修改

  • 修改前:

在这里插入图片描述

  • 修改后:

在这里插入图片描述

路由加载方式,成为路由懒加载模式,可以对每个路由组件依赖的代码进行分块,加载页面时按需加载

第二步:运行代码

npm run build

之前打包后显示4个文件,现在会分开显示所有文件,且文件资源体积相比之前有所减小,但某些文件仍然较大

在这里插入图片描述

22-webpack-打包优化——体积较大的第三方包,使用cdn的安装方式进行加载

在这里插入图片描述

第二步:public/index.html中, 添加第三方包的cdn安装方式链接

在这里插入图片描述

第三步:命令行打包

npm run build

执行后,dist文件被清理;echarts文件打包时被忽略,第三方包文件变小

在这里插入图片描述

打包体积变小,验证打包优化得以实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值