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

news2024/12/22 6:07:55

文章目录

  • 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,可以发现此时项目已经启动了
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringMvc异常处理机制

预期异常和运行异常&#xff0c;前者通过捕获&#xff0c;后者通过规范代码开发、测试等手段减少发生概率。 系统dao层、service层、controller层出现都可通过throws Exception向上抛出&#xff0c;最终由SpringMvc前端控制器交由异常处理器进行异常处理。 SpringMvc项目异常处…

有必要买apple pencil吗?ipad触控笔推荐平价

科技的飞速发展改变了人们的生活。在各种电子、数码产品不断涌现的今天&#xff0c;这款能与平板电脑相匹配的电容笔就应运而生了。随着国内的电容笔技术的进步&#xff0c;它的使用领域也在不断地扩展&#xff0c;逐渐开始取代苹果原装电容笔。下面&#xff0c;我将为大家介绍…

IDEA使用GIT提交代码中文日志(commit message)乱码

最近换了新的开发环境&#xff0c;导致提交gti中文注释乱码&#xff0c;遂记录一下解决方案 idea中查看git提交信息显示中文是正常的 gitee上显示乱码 本地显示也是乱码 一、命令修改编码格式 git 安装目录下执行 git config --global i18n.commitencoding utf-8git config …

《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(6)-Charles安卓手机抓包大揭秘

1.简介 Charles和Fiddler一样不但能截获各种浏览器发出的 HTTP 请求&#xff0c;也可以截获各种智能手机发出的HTTP/ HTTPS 请求。 Charles也能截获 Android 和 Windows Phone 等设备发出的 HTTP/HTTPS 请求。 今天宏哥讲解和分享Charles如何截获安卓移动端发出的 HTTP/HTTP…

2023 年 7 月中旬使用各种随身 wifi 的电脑无法上网的解决方法

微软近日推送了安全更新&#xff0c;在 Win10 下编号为 KB5028166&#xff0c;在 Win11 下编号为 KB5028185。此补丁会导致部分电脑无法上网&#xff0c;主要是使用了各种品牌的随身 Wifi 的电脑。 具体症状表现为从控制面板的网络连接&#xff08;ncpa.cpl&#xff09;打开详细…

vue项目展示pdf文件

记录贴 最近我有个需求,就是在h5页面上展示pdf文件,分页,最后一页有个蒙层阴影渐变的效果,尝试过一些插件,但都不是很好用,最后用了pdfjs-dist加上canvas 可以看下效果 先下载: npm i pdfjs-dist2.5.207下面展示代码 html: <template><canvas v-for"pageNumb…

浅谈设计模式之单例模式

0 单例模式简介 单例模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。单例模式指的是单一的一个类&#xff0c;该类负责创建自己的对象&#xff0c;并且保证该对象唯一。该类提供了一种访问其唯一对象的方法&#xff0c;外部需要调用该类的对象可以通过方法获…

Python 自学 day06 JSON 数据传输,折线图,柱状图,动态柱状图

1.python JSON的知识 1.1 什么是 JSON 答&#xff1a; JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去组织和封装数据. JSON本质上是一个带有特定格式的字符串。 1.2 JSON 的主要功能 答&#xff1a;json就是一种在各个编程语言中流通的…

栈和队列OJ

文章目录 1.用队列实现栈2.用栈实现队列3.设计循环队列4.循环队列经典题 1.用队列实现栈 typedef int QDataType; typedef struct QueueNode {struct QueueNode* next;QDataType data; }QNode;typedef struct Queue {QNode* head;QNode* tail; }Queue; typedef struct MyStack …

⛳ Java数组

Java数组的目录 ⛳ Java数组&#x1f3a8; 一&#xff0c;一维数组&#x1f463; 1.1&#xff0c;概念&#x1f4e2; 1.2&#xff0c;基本用法1&#xff0c;语法格式2&#xff0c;代码 &#x1f4bb; 1.3&#xff0c;内存结构&#x1f4dd; 1.4&#xff0c;练习 &#x1f381; …

天翎MyApps低代码平台唯品会金牌客服管理系统

项目痛点&#xff1a; 作为一家知名的创新大型电商&#xff0c;唯品会秉承“传承品质生活&#xff0c;提升幸福体验”的企业使命。基于客服铁军锻造项目&#xff0c;实现基于金牌案例的提交、评审、积分&#xff0c;学习功能。 项目中的晋升机制、案例产生学习机制、双激励机制…

赛桨PaddleScience v1.0正式版发布,飞桨科学计算能力全面升级!

AI for Science日益表现出突破传统科学研究能力瓶颈的巨大潜力&#xff0c;正在成为全球科学研究新范式。近年来&#xff0c;各学科不断加入&#xff0c;模型精度、泛化性逐渐提高&#xff0c;不同技术路径、不同应用场景的AI for Science成功应用不断涌现&#xff0c;深度融合…

详解 Spring - Ioc(控制权反转) 和 DI(依赖注入)

目录 Spring 是什么? Ioc Ioc 的优点 DI Ioc 和 DI 的区别 Spring 是什么? 通常情况下 Spring 是指 Spring Framework (Spring 框架), 是一个开源框架, 有着庞大的社区, 这就是他能长久不衰的原因, Spring 支持广泛的应用场景, 他可以让企业级的应用开发起来更简单 S…

Selenium之css如何实现元素定位,你了解多少?

前言 世界上最远的距离大概就是明明看到一个页面元素站在那里&#xff0c;但是我却定位不到&#xff01;&#xff01; Selenium定位元素的方法有很多种&#xff0c;像是通过id、name、class_name、tag_name、link_text等等&#xff0c;但是这些方法局限性太大&#xff0c; 随…

简单认识框架

hi,大家好,好久不见今天为大家带来框架相关的知识 文章目录 &#x1f338;1.框架&#x1f95d;1.1为什么要学习框架 &#x1f338;2.框架的优点&#x1f95d;2.1采用servlet创建项目&#x1f440;2.1.1缺陷 &#x1f95d;2.2采用SpringBoot创建项目&#x1f440;2.2.1优势 &…

Vue-Cli脚手架的安装和使用

文章目录 一、Vue-Cli脚手架的环境准备1. 安装Node.js1-1 去 [Node.js官网](https://nodejs.org/zh-cn/) 下载安装包&#xff0c;修改安装路径到其它盘&#xff0c;如 G:\Program Files1-2 安装npm淘宝镜像&#xff0c;提速 2. 设置 cnpm的下载路径和缓存路径2-1 在安装目录 G:…

Zoho Projects:Jira的理想替代品,让项目管理更高效

在软件开发生命周期中&#xff0c;项目管理一直是一个非常重要的环节。为了更好地协作、追踪项目的进程和管理任务&#xff0c;许多公司选择了Jira这款著名的项目管理工具&#xff0c;它是个非常强大的工具&#xff0c;但同时也有非常明显的缺点。今天&#xff0c;我们将向大家…

知识普及:[18F]FB RGD,18F标记RGD多肽,tumor显像剂,

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ 为大家介绍&#xff08;CAS&#xff1a;N/A&#xff09;,试剂仅用于科学研究&#xff0c;不可用于人类&#xff0c;非药用&#xff0c;非食用 分子式&#xff1a;C34H44FN9O9 分子量&#xff1a;740.8 中文名称&#xff1a…

linux之Ubuntu系列 系统信息 (一)查看文件、磁盘 、进程

时间和日期 查看当前的系统时间 date 查看日历 -y 显示本年度日历&#xff0c; 不加-y 选项&#xff0c;显示本月日历 cal [-y] 查看磁盘 和 目录 空间 df [-h] df&#xff1a;disk free 显示磁盘可用空间&#xff0c;-h&#xff0c;跟 ls -lh 效果类似&#xff0c;以人性化方…