前端工程化第一章:webpack5基础(上)

文章目录

  • 1. 什么是webpack?
  • 2. webpack使用
    • 2.2. 前置知识
    • 2.1. 创建一个项目
  • 3. webpack打包
    • 3.1. 创建一个webpack.config.js文件
    • 3.2. 入口(entry)
      • 3.2.1. webpack.config.js
      • 3.2.2. src/index.js
      • 3.2.3. package.json
    • 3.3. 输出(output)
      • 3.3.1. webpack.config.js
    • 3.4. 加载器(loader)
      • 3.4.1. src/index.js
      • 3.4.2. src/index.css
      • 3.4.3. webpack.config.js
    • 3.5. 插件(plugin)
    • 3.6. devServer
      • 3.6.1. webpack.config.js
      • 3.6.2. package.json

1. 什么是webpack?

Webpack 是一个现代 JavaScript 应用程序的静态模块打包器。它是一个用于将代码编译成浏览器可识别的格式的工具。

webpack 可以实现以下的功能:

  • 代码转换TypeScript 编译成 JavaScriptSCSSless 编译成 CSS 等。
  • 文件优化:压缩 JavaScriptCSSHTML 代码,压缩合并图片等。
  • 代码分割提取多个页面的公共代码、提取首屏不需要执行部分的代码让其异步加载。
  • 模块合并:在采用模块化的项目里会有很多个模块和文件,需要构建功能把模块分类合并成一个文件
  • 自动刷新:监听本地源代码的变化,自动重新构建刷新浏览器
  • 代码校验:在代码被提交到仓库前需要校验代码是否符合规范,以及单元测试是否通过。
  • 自动发布:更新完代码后,自动构建出线上发布代码并传输给发布系统
  • 依赖管理:通过分析模块之间的依赖关系,自动加载所需的依赖模块。
  • 插件扩展:通过插件扩展功能,满足不同项目的需求。

构建其实是工程化自动化思想在前端开发中的体现,把一系列流程用代码去实现,让代码自动化地执行这一系列复杂的流程。 构建给前端开发注入了更大的活力,解放了我们的生产力。

Webpack 的工作原理是从一个入口文件开始,递归地解析出所有的依赖,然后将这些依赖打包成一个或多个输出文件。Webpack 支持多种模块化规范,包括 CommonJSAMDES6 模块等。

2. webpack使用

2.2. 前置知识

  • node基础
  • 包的理解
  • 模块化思想

2.1. 创建一个项目

  1. 创建一个文件夹

  2. 创建一个package.json文件

    npm init -y
    

    在这里插入图片描述

  3. 安装依赖

      npm install webpack webpack-cli  webpack-dev-server style-loader css-loader html-webpack-plugin cross-env mini-css-extract-plugin less less-loader postcss postcss-loader autoprefixer @babel/core @babel/preset-env babel-loader typescript ts-loader @babel/preset-typescript  eslint eslint-webpack-plugin eslint-config-standard eslint-plugin-promise eslint-plugin-import eslint-plugin-node @typescript-eslint/eslint-plugin --save
    

    在这里插入图片描述

3. webpack打包

3.1. 创建一个webpack.config.js文件

在这里插入图片描述

webpack中文文档

3.2. 入口(entry)

  • entry 选项用于指定 Webpack 打包的入口文件,即告诉 Webpack 从哪个文件开始打包

3.2.1. webpack.config.js

module.exports = {
  entry: "./src/index.js",
};

在这里插入图片描述

3.2.2. src/index.js

let a = 1;
console.log(a);

在这里插入图片描述

3.2.3. package.json

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

在这里插入图片描述
运行 npm run build 查看结果
默认生成了一个dist文件,这就是打包后的代码。

在这里插入图片描述

3.3. 输出(output)

  • output 选项用于指定 Webpack 打包后输出的文件和路径,即告诉 Webpack 打包后的文件应该放在哪个目录下以及如何命名
  • output 通常配置为一个对象,包含了多个属性
    • path 指定了打包文件的输出路径必须是一个绝对路径
    • filename 指定了打包后的文件名可以包含路径信息

3.3.1. webpack.config.js

const path = require("path"); // nodeJs 的 path 模块

module.exports = {
  // entry:默认的路径是src/index.js,也可以自定义
  entry: "./src/index.js",
  output: {
  	// 打包文件的输出位置
    path: path.resolve(__dirname, "dist"), 
    // 打包后的文件名
    filename: "index.js", 
  },
};

运行 npm run build 之后的效果:

  1. 根文件下生成了一个 dist 文件夹,作为打包后输出文件
  2. dist 中生成了一个 index.js 文件。由默认的 main.js 文件变成了我们自定义的 index.js 文件,其他内容没有变化。
    在这里插入图片描述

3.4. 加载器(loader)

  • loaderWebpack 的一个关键功能,它可以处理各种各样的文件类型
  • Webpack 将一切文件视为模块,但只有 JS 模块才能被直接运行和使用
  • Loader 可以将非 JS 模块(如CSS、图片等)转换为 Webpack 可以处理的有效模块
  • loader 是在“webpack.config.js”文件中使用“module”属性指定的。每个loader 都定义为一个对象,该对象具有指定 loader 应处理哪些文件的“test” 属性和指定要使用的加载程序的 “use” 属性。

例如,loader可以用于将Sass或Less文件转换为CSS,或者将ES6代码转换为可以由旧浏览器执行的ES5代码

3.4.1. src/index.js

import "./index.css";
console.log(123);

3.4.2. src/index.css

body {
  background-color: red;
  color: blue;
}

注意:此时运行npm run build 会报错,由于浏览器只认识js代码,因此在webpack中需要将其他的代码进行处理,此时需要使用style-loader、css-loader来处理我们的css代码

在这里插入图片描述

3.4.3. webpack.config.js

  • 每个 Loader 规则由两部分组成:匹配条件处理方式
  • 匹配条件通常使用正则表达式,用于匹配需要被转换的文件
  • 处理方式则是具体的转换操作
    • test 属性指定了匹配的文件类型
    • use 属性指定了转换方式
    • exclude 用于指定哪些文件或目录不应该被 loader 处理
    • css-loader 作用是将CSS代码转换为JavaScript代码
    • css-loader 可以识别 @importurl() 等语句,实现 CSS 模块的引用和解析
    • style-loader 用于将 css-loader 转换后的 JavaScript 对象,以 style 标签的形式动态插入到 HTML 文件中(动态创建style标签,然后放到head标签中)
module.exports = {
  // ......
  module: {
    rules: [
		{
	      test: /\.css$/, // 匹配以 .css 结尾的文件
	      use: ["style-loader", "css-loader"], // 注意:loader执行顺序是从后往前执行,顺序不能改变
	    },
	]
  },
};

可以看到,此时运行 npm run build 已经打包成功了

在这里插入图片描述
测试:在dist目录下创建一个html文件,测试一下样式是否生效

在这里插入图片描述
可以看到,此时样式已经生效了

在这里插入图片描述

例子:css代码通过loader转换成浏览器可识别代码的模拟过程(伪代码)

/**
 * 模拟 css 样式大概转换过程
 */

// 1. webpack 将css读取出来
let cssCode = `body {
  background-color: red;
  color: blue;
}`;

// 2. css-loader将css代码转换成js代码
let cssModule = `
  module.exports = "
    body {
      background-color: red;
      color: blue;
    }
  "
`;

// 3. style-loader将css-loader转换的内容经过处理。放到动态创建的style标签中,变成浏览器能读取的代码
let style = document.createComment("style");
style.innerHTML = cssModule;
document.head.appendChild(style);

3.5. 插件(plugin)

Webpack 插件是用于扩展 Webpack 功能的 JavaScript 对象。它们可以用于各种用途,例如打包输出优化资源管理代码压缩等。以下是一些常见的 Webpack 插件及其功能:

  1. UglifyJSPlugin:用于压缩 JavaScript 代码,减少文件大小并提高页面加载速度。
  2. HtmlWebpackPlugin:用于生成 HTML 文件,并将打包后的 JavaScript 和 CSS 文件自动添加到 HTML 文件中。
  3. ExtractTextWebpackPlugin:用于将 CSS 代码从 JavaScript 文件中提取出来,并将其保存为单独的 CSS 文件。
  4. CleanWebpackPlugin:用于在打包之前清除之前的打包文件。
  5. CopyWebpackPlugin:用于将文件或文件夹从源目录复制到输出目录。
  6. ProvidePlugin:用于自动加载模块,而不必使用 import 或 require 语句。

例子:通过 HtmlWebpackPlugin 插件生成 HTML 文件,并将打包后的 JavaScriptCSS 文件自动添加到 HTML 文件中

  1. 创建模板文件 src/index.html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>模板文件</title>
</head>
<body>
  模板文件
</body>
</html>
  1. webpack.config.js
const HtmlWebpackPlugin = require("html-webpack-plugin"); // 生成html的插件,并自动将打包后的 JS、CSS 文件引入 HTML 文件中

module.exports = {
  // ......
  module: {
  	// ......
  },
  plugins: [
    // 插件使用时,像构造函数一样直接 new 即可
    // template:模板文件的路径
    // filename:打包后生成的文件名
    // chunk:代码块
    new HtmlWebpackPlugin({ template: "./src/index.html" }),
  ],
};
  1. 运行 npm run build,查看打包后的 dist 文件,此时已经生成了index.html 文件

在这里插入图片描述

3.6. devServer

  • webpack-dev-server是一个基于 ExpressWeb 服务器,它可以为 Webpack 打包后的代码提供一个本地开发环境,支持实时刷新热替换自动构建等功能,大大提高了开发效率
    • static:静态资源目录的路径,设置该参数可以在服务器中访问这些静态资源
    • compress:启用 gzip 压缩,默认是关闭的
    • port:服务器端口,默认是 8080
    • host:服务器主机名,默认是 localhost
    • open:是否自动在浏览器中打开页面,默认是关闭的
    • hot:启用模块热替换功能,默认是关闭的
    • watchFiles:需要监听的文件列表,当这些文件发生变化时,自动重启服务器
    • historyApiFallback:参数用于设置是否启用 HTML5 历史记录 API,用于处理单页应用的路由问题。默认情况下,当使用浏览器的前进/后退按钮时,devServer 会尝试根据 URL 路径查找对应的静态资源,如果找不到就返回 404。如果启用了 historyApiFallback,则会将这些请求重定向到 index.html,然后交给前端路由来处理
  • 在命令行中运行 webpack-dev-server 命令后,webpack-dev-server 将会启动一个本地 Web 服务器,并监听我们定义的端口。我们可以在浏览器中访问 http://localhost:9000,即可预览打包后的页面,并实现实时刷新热替换功能

3.6.1. webpack.config.js

在这里插入图片描述

devServer: {
   static: path.join(__dirname, "public"), // 静态资源路径
   compress: true, // 是否开始gzip压缩
   host: "localhost", // 服务器主机名
   port: 80, // 服务器端口名
   open: true, //启动项目后是否自动打开浏览器
   hot: true, // 是否启动模块热替功能
   historyApiFallback: true, // 处理单页应用的路由问题
   watchFiles: ["src/**/*.js", "src/**/*.css"], // 需要监听的文件列表,当这些文件发生变化时,自动重启服务器
 },

3.6.2. package.json

在这里插入图片描述

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

运行 npm run dev,可以发现此时项目已经启动了
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/42635.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于深度学习的高精度课堂人脸检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度课堂人脸检测系统可用于日常生活中或野外来检测与定位课堂人脸目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的课堂人脸目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标…

【论文阅读】2020ECCV-DFDNet

Blind Face Restoration via Deep Multi-scale Component Dictionaries 中文&#xff1a;基于深度多尺度分量字典的盲人脸复原 paper&#xff1a; code&#xff1a;https://github.com/csxmli2016/DFDNet 摘要&#xff1a; 近年来&#xff0c;基于参考的人脸恢复方法因其在真…

使用Seata解决分布式事务问题

说明&#xff1a;在分布式架构下&#xff0c;一个请求需要多个微服务来实现。当一个请求牵扯到多个微服务时&#xff0c;事务问题就变得麻烦起来。 问题描述 现在有三个服务&#xff0c;分别是账户服务、库存服务和订单服务&#xff0c;生成一个订单&#xff0c;需要确保商品…

Docker 命令(二)

查看 docker 版本信息 docker version #查看版本信息docker 信息查看 docker info Client:Context: defaultDebug Mode: falsePlugins:app: Docker App (Docker Inc., v0.9.1-beta3)buildx: Build with BuildKit (Docker Inc., v0.5.1-docker)Server:Containers: 0 …

Python补充笔记3-bug问题

目录 一、Bug 粗心导致的语法错误​ ​编辑 知识不熟练导致的错误​ 思路不清晰导致的问题​ 被动掉坑​ 二、try…except…else结构​ 三、try…except…else…finally结构​ 四、常见异常类型​编辑traceback模块 pycharm调试 一、Bug 粗心导致的语法错误 知识不熟练导致的…

【Vue 面试题10道】我好像之前想过要写,不过之前JavaScript面试题比较多,就暂时略过了,这些应该几乎把常问的都包括了

博主&#xff1a;_LJaXi Or 東方幻想郷 专栏&#xff1a; 前端面试题 开发工具&#xff1a;Vs Code 本题针对 Vue2 这些几乎把常用的都包括了&#xff0c;问别的就没意思了&#xff0c;毕竟工作拧螺丝嘛 我都好久不用Vue了&#xff0c;不过用了React再回看Vue感觉好简单啊… 其…

Dubbogo 详解

Dubbogo 详解 简介 dubbo功能很强大的微服务开发框架&#xff0c;支持多种通信协议&#xff0c;并具有流量治理的功能。 dubbo在有了大转变&#xff0c;拥抱了云原生&#xff0c;从哪些方面可以体现呢&#xff1f; 推出了自己的Trip协议修复了服务发现的级别&#xff0c;之…

20230723红米Redmi Note8Pro掉在水里的处理步骤

20230723红米Redmi Note8Pro掉在水里的处理步骤 2023/7/23 18:18 百度搜搜&#xff1a;小米手机进水 破音怎么处理 Redmi Note8Pro 6400万全场景四摄 液冷游戏芯 4500mAh长续航 NFC 18W快充 红外遥控 https://www.zhiliancy.com/a/q5podmr12.html 首页 / 热文 / 内容 小米喇叭…

【从删库到跑路】MySQL数据库的索引(一)——索引的结构(BTree B+Tree Hash),语法等

&#x1f38a;专栏【MySQL】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 &#x1f970;欢迎并且感谢大家指出小吉的问题 文章目录 &#x1f354;概述&#x1f354;索引结构⭐B-Tree多路平衡查找树&#x1f3f3;️‍&a…

前端技术Vue学习笔记--001

前端技术Vue学习笔记 文章目录 前端技术Vue学习笔记1、Vue2和Vue3比较2、Vue简介3、Vue快速上手4、插值表达式{{}}5、Vue响应式特性6、Vue指令6.1、v-html指令6.2、v-show指令和v-if指令6.3、v-else指令和v-else-if指令6.4、v-on指令6.4.1、v-on指令基础6.4.2、v-on调用传参 6.…

win10电脑便签常驻桌面怎么设置?

你是否曾经因为繁忙的工作而忘记了一些重要的事项&#xff1f;相信很多人都会回答&#xff1a;忘记过&#xff01;其实在快节奏的职场中&#xff0c;我们经常需要记录一些重要的信息&#xff0c;例如会议时间、约见客户时间、今天需要完成的工作任务等。而为了能够方便地记录和…

阿里云安装宝塔面板

阿里云安装宝塔面板 1.安装步骤2.需要加入安全组&#xff0c;打开端口3.安装宝塔 1.安装步骤 1.这里主要以阿里云的服务器 ECS为例子,需要安装纯净的系统 创建过程: 这边先用的是免费的: 2.需要加入安全组&#xff0c;打开端口 进入实例选项卡&#xff1a; 快速添加&…

低代码平台协同OA升级,促进金融企业信息化建设

编者按&#xff1a;数字化办公是信息化时代每个企业不可避免的&#xff0c;OA系统是数字化办公的关键环节。如何与时俱进&#xff0c;保持企业的活力&#xff0c;增强企业综合竞争力&#xff1f;本文分析了企业OA系统为什么需要升级&#xff0c;并进一步指出如何实现升级。 关…

Linux环境下Elasticsearch相关软件安装

Linux环境下Elasticsearch相关软件安装 本文将介绍在linux(Centos7)环境下安装Elasticsearch相关的软件。 1、安装Elasticsearch 1.1 Elasticsearch下载 首先去Elasticsearch官网下载相应版本的安装包&#xff0c;下载之后传输到linux服务器上。 官网地址&#xff1a;http…

在自定义数据集上微调Alpaca和LLaMA

本文将介绍使用LoRa在本地机器上微调Alpaca和LLaMA&#xff0c;我们将介绍在特定数据集上对Alpaca LoRa进行微调的整个过程&#xff0c;本文将涵盖数据处理、模型训练和使用流行的自然语言处理库(如Transformers和hugs Face)进行评估。此外还将介绍如何使用grado应用程序部署和…

STM32MP157驱动开发——LED驱动(设备树)

文章目录 设备树驱动模型如何使用设备树写驱动程序设备树节点要与 platform_driver 能匹配设备树节点指定资源&#xff0c;platform_driver 获得资源 LED 模板驱动程序的改造&#xff1a;设备树驱动模型修改设备树&#xff0c;添加 led 设备节点修改 platform_driver 的源码编译…

设计模式再探——状态模式

目录 一、背景介绍二、思路&方案三、过程1.状态模式简介2.状态模式的类图3.状态模式代码4.状态模式还可以优化的地方5.状态模式的项目实战&#xff0c;优化后 四、总结五、升华 一、背景介绍 最近产品中有这样的业务需求&#xff0c;不同时间(这里不是活动的执行时间&…

前端学习——Vue (Day1)

Vue 快速上手 Vue 是什么 创建 Vue 实例 Vue2官网&#xff1a;https://v2.cn.vuejs.org/ <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge…

基于单片机的语音识别智能垃圾桶垃圾分类的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;液晶显示当前信息和状态&#xff1b;通过语音识别模块对当前垃圾种类进行语音识别&#xff1b; 通过蜂鸣器进行声光报警提醒垃圾桶已满&#xff1b;采用舵机控制垃圾桶打开关闭&#xff1b;超声波检测当前垃圾桶满溢程度&#xff1…

【目标跟踪】2、FairMOT | 平衡多目标跟踪中的目标检测和 Re-ID 任务 | IJCV2021

文章目录 一、背景二、方法2.1 Backbone2.2 检测分支2.3 Re-ID 分支2.4 训练 FairMOT2.5 Online Inference 三、效果3.1 数据集3.2 实现细节3.3 消融实验3.4 最终效果 论文&#xff1a;FairMOT: On the Fairness of Detection and Re-Identification in Multiple Object Tracki…