当前位置: 首页 > news >正文

Webpack 基础入门以及接入 CSS、Typescript、Babel

一、什么是 Webpack

Webpack 是一款 JS 模块化开发的技术框架,其运作原理是将多个 JS 文件关联起来构成可运行的应用程序。

Webpack 拥有丰富的 plugins / loaders 插件生态圈,可以让 js 识别不同的语言如 .css, .scss, .sass, .json, .xml, .ts, .vue, .tsx 等等,这也让 Webpack 至今仍然在许多项目中仍有一席之地。

尽管现在的构建工具百花齐放,如 vite, vue-cli, craco, esbuild, glup, rollup
但大部分构建工具的许多概念基本都是相通的,我认为学习 webpack 依然是前端人员必学技能之一。

二、使用 Webpack

2.1 准备工作

  1. 新建案例项目 webpack-example

  2. 安装 Webpack

mkdir webpack-example && cd webpack-example
yarn init -y
yarn add webpack webpack-cli -D

当前 Webpack 版本:5.88.2

  1. 新建目录&文件
mkdir src && cd src && touch index.js
cd ../ && touch index.html

结构如下:
在这里插入图片描述

2.2 编译&打包

这里分几个步骤:

  1. index.js 代码改造:
const sayHi = () => {alert('Hello, webpack!')
}
sayHi()
  1. package.json 配置 webpack 脚本并执行。
"scripts": {"build": "webpack"},

在这里插入图片描述
构建后的产物默认会放在 dist 目录。

  1. index.html 引入产物
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script src="./dist/main.js"></script>
</head>
<body></body>
</html>

本地 server 打开 index.html 即可:
在这里插入图片描述
你可能会问,这和直接引入 src/index.js 有何区别?别急,还没体现 webpack 能力呢。

继续改造:

  1. src/ 新增 date.js & tools.js 俩文件 ,内容如下:
// src/date.js
export const getDate = () => {return new Date().toLocaleDateString()
}
// src/tools.js
export const add = (a, b) => {return a + b
}
  1. 在 src/index.js 中引入:
// 引入👇
import { getDate } from './date'
import { add } from './tools'const run = () => {console.log('The date is: ', getDate())console.log('10 + 20 is equal', add(10, 20))
}
run()
  1. 重新 build
    在这里插入图片描述
    可以看到 date.js 和 tools.js 被一起打包进 main.js 文件,模块化开发概念有没有逐渐涌现出来?

在这里插入图片描述

三、接入 CSS

截至目前,我们依旧未使用 webpack 配置的能力,仅通过一个 build 命令。

现在开始思考下,在不依赖 webpack 的情况下,js 中引入 css 文件可行?

当然没问题,现代浏览器基于 ES6 语法可以直接引入 css 文件。
但你会发现引入后抛出 MIME 错误,这是因为它只负责请求,不负责非 JS 响应资源处理。
在这里插入图片描述

下面用 webpack 配置来解决。

3.1 准备工作

  1. 安装依赖包:
yarn add style-loader css-loader -D

解释:css-loader 将 css 内容打包成 CommonJS ,style-loader 引入 CommonJS 并将其插入到页面 style 中,这两个是必不可少的。

3.1 配置&使用

  1. 项目新建 webpack.config.js 文件,内容如下:
module.exports = {module: {rules: [{test: /\.css$/i,use: ['style-loader', 'css-loader'],},],},
};

解释:rules 作为引入 loader 的入口,test 表示要处理匹配的文件后缀名。
rules 的选项还有很多,这里仅以最简单的方式作为演示。
use 执行顺序从最后开始: css-loader -> style-loader 。

  1. src/ 新增 index.css 文件,样式如下:
body {background-color: cyan;
}
  1. src/index.js 引入
// ...
import './index.css'
// ...
  1. 调整 package.json build 脚本,指定配置:
"scripts": {"build": "webpack --config=webpack.config.js"},
  1. 重新 build 即可看到效果:
    在这里插入图片描述

在 dist/ 产物中可以看到,css 样式是通过 JS 插上去的,你可能会问,这和在 index.html 中直接引入 css 有何不同?

关于这个问题,我想说如果是 100 个 css 呢?毕竟一个项目的 css 文件数量是非常多的。
再比如像 scss, less 这些 CSS 预处理语言的文件呢,总不可能手动引入吧?

还是得靠 webpack ,只需引入对应的插件和 loader 即可;为了让 webpack 入门纯粹点,这里不再详细赘述。

四、接入 Typescript

随着越来越多的项目引入 TS,似乎就成了前端必学的“新语言”~

如果还没用过 Typescript 的同学可参考:TypeScript 日常基本语法 再回头看本文。

4.1 准备工作

  1. 安装依赖包
yarn add typescript ts-loader -D

解释:typescript 是一款专门将 ts 编译成 js 的工具,本身可以独立存在,而 ts-loader 充当 typescript 与 webpack 之间的信号传递者。

4.2 配置&使用

  1. webpack.config.js 中配置如下:
module.exports = {module: {rules: [{test: /\.css$/i,use: ['style-loader', 'css-loader'],},// 新增👇{test: /\.tsx?$/,use: 'ts-loader',exclude: /node_modules/, // 不处理 node_modules 。},],},resolve: {// 调整后缀解析优先级。extensions: ['.ts', '.tsx', '.js'],},
};

提示:配置 extensions 的原因是,Webpack 默认以 src/index 作为编译入口,再根据默认后缀优先级顺序: [‘js’, ‘json’, ‘.wasm’] 开始解析,为了避免解析现有的 index.js,这里要手动调整 extensions ,当然也可以设置 entry ,这里先不演示,后面会讲到。

  1. src/下新增 index.ts 文件,内容如下:

import { getDate } from './date'
import { add } from './tools'
import './index.css'
// 这里用 TS 提供的 void 语法作为测试。
const run = (): void => {console.log('The date is: ', getDate())console.log('10 + 20 is equal', add(10, 20))
}
run()
  1. 重新 build,效果和原来一样:
    在这里插入图片描述

五、接入 Babel

balbel 是一款是专门将 JS 高级语法编译为可执行的低版本语法编译器,比如 ES6/7/8 -> ES5。
如果还没用过的同学可参考:JS & 介绍 Babel 的使用及 presets & plugins 的概念 再回头看文本。

5.1 准备工作

  1. 安装依赖:
yarn add babel-loader @babel/core @babel/preset-env -D

解释:
- @babel/core 是编译 JS 的核心逻辑,即编译器。
- @babel/preset-env 基于编译器,集成了各种插件,比如 es6 -> es5, class -> prototype,链式 ?. 语法等。
- balbel-loader 充当 @babel/core 与 webpack 之间的信号传递者。

5.2 配置&使用

  1. webpack.config.js
module.exports = {// 新增:开启本地调试模式,让产物不要压缩。mode: 'development',// 新增:指定编译入口,避免与上章节的 index.ts 冲突。entry: './src/index.js',module: {rules: [{test: /\.css$/i,use: ['style-loader', 'css-loader'],},{test: /\.tsx?$/,use: 'ts-loader',exclude: /node_modules/,},// 新增:{test: /\.(?:js|ts)$/,exclude: /node_modules/,use: {loader: 'babel-loader',options: {presets: [['@babel/preset-env']]}}}],},
};
  1. index.js 中使用高版本语法作为演示,比如 ES6 的 const 声明关键字:
const run = () => {console.log('The date is: ', getDate())console.log('10 + 20 is equal', add(10, 20))
}
run()
  1. 重新 build,在 dist/main.js 源码中便可看到 const 被转成了 var
    在这里插入图片描述

5.3 babel 兼容 ts

  1. 先将 entry 引入为 ./src/index.ts
// webpack.config.js
...
entry: './src/index.ts',
...
  1. src/index.ts 语法如下,这里用 void 作为演示:
import './index.css'
const run = (): void => {const obj = { num: 100 }console.log('Hello, webpack', obj?.num === 100)
}
run()
  1. 执行 build
yarn build

你会发现 babel 并不识别 .ts 文件,直接报错了:

在这里插入图片描述
这是因为 babel 默认仅支持 JS,对于 TS 还得单独处理:

  1. 安装 Babel 插件:
 yarn add @babel/preset-typescript -D

解释:

  • babel/preset-typescript 是基于 babel-core 编译器实现出来的插件,就是让 babel 可识别 .ts 后缀。

注意:插件本身不负责编译 ts -> js,仅仅对 ts 源码以 js 的角度来进行转换处理。

  1. 引入插件:
module.exports = {mode: 'development',entry: './src/index.ts',module: {rules: [{test: /\.css$/i,use: ['style-loader', 'css-loader'],},{test: /\.tsx?$/,use: 'ts-loader',exclude: /node_modules/,},{test: /\.(?:js|ts)$/,exclude: /node_modules/,use: {loader: 'babel-loader',options: {presets: [['@babel/preset-env',],// 新增:['@babel/preset-typescript',]],}}}],},
};
  1. 重新 build 即可:
    在这里插入图片描述

F Q A

4.1 Webpack 和 Babel 有什么区别?

咋一看,Webpack 和 Babel 好像都能编译 JS?这两者间有何区别呢?其实区别还是蛮大的:

  1. Webpack 就像一位 JS 文件管理者,拥有着大量的处理不同文件&产物的插件圈,最终将各种文件联起来形成页面应用。
  2. Babel 可以将 JS 代码编译为可向下兼容运行的低版本代码,它也有着丰富的插件圈,但它们是专门与 js 源码打交道的,这也是与 webpack 最大的区别。

换个角度想,如果 webpack 和 babel 都是干同一份工作,那两者就不可能一起运作,属矛盾关系。

4.2 Webpack 文档资料过于庞大,有必要全阅读完?

这是完全没必要的,每个人的工作性质都不一样,用到哪看到哪儿即可,过不了多久还是会忘记。

4.3 Webpack 是不是过时了?

Webpack 从配置概念上看并不过时,它就像构建工具们的老师,可以从中学到许多东西。


完!

相关文章:

Webpack 基础入门以及接入 CSS、Typescript、Babel

一、什么是 Webpack Webpack 是一款 JS 模块化开发的技术框架&#xff0c;其运作原理是将多个 JS 文件关联起来构成可运行的应用程序。 Webpack 拥有丰富的 plugins / loaders 插件生态圈&#xff0c;可以让 js 识别不同的语言如 .css, .scss, .sass, .json, .xml, .ts, .vue…...

postgresql-自增字段

postgresql-自增字段 标识列IdentitySerial类型Sequence序列 标识列Identity -- 测试表 create table t_user( -- 标识列自增字段user_id integer generated always as identity primary key,user_name varchar(50) not null unique );-- 自动生成序列 CREATE SEQUENCE public…...

SpringBoot中使用Servlet和Filter

为什么要把Servlet和Filter写在一起,因为使用方式很相似 两种方式 第一种,使用Servlet和Filter 使用Servlet 继承HttpServlet 注册Servlet 使用Filter 1.自定义过滤器 2.注册过滤器 这里注意一点 使用/**无效 至少我这2.4.5版本是这样 过滤所有请求用/* 那么其实还有…...

Monkey命令

shell, monkey, system, Android, 文件系统Monkey, 示例, 简介 一、Monkey测试简介 Monkey测试是Android平台自动化测试的一种手段&#xff0c;通过Monkey程序模拟用户触摸屏幕、滑动Trackball、按键等操作来对设备上的程序进行压 力测试&#xff0c;检测程序多久的时间会发生…...

力扣 -- 279. 完全平方数(完全背包问题)

解题步骤&#xff1a; 参考代码&#xff1a; 未优化代码&#xff1a; class Solution { public:int numSquares(int n) {const int INF0x3f3f3f3f;int msqrt(n);//多开一行&#xff0c;多开一列vector<vector<int>> dp(m1,vector<int>(n1));//初始化第一行…...

在将对象 => JSON格式时,无法序列化部分属性

问题现象: 在ssm项目中&#xff0c;一个controller返回Msg对象&#xff08;自定义对象&#xff0c;包含三个属性&#xff0c;int code&#xff1b;String msg&#xff1b;HashMap map&#xff1b;同时这三个属性都有对应的get和set方法&#xff09;&#xff0c;我的map属性里面…...

用python表格初级尝试

Excel&#xff0c;我的野心 当我输入3,2 就表示在第3行第2列。的单元格输入数据input输入表头 &#xff08;input内除了/&#xff0c;空格 回车 标点符号等 全部作为单元格分隔符&#xff09;由我设置input输入的是行or列 给选项 1. 行 2. 列默认回车或没输入值是列由我设置起…...

【单片机】16-LCD1602和12864显示器

1.LCD显示器相关背景 1.LCD简介 &#xff08;1&#xff09;显示器&#xff0c;常见显示器&#xff1a;电视&#xff0c;电脑 &#xff08;2&#xff09;LCD&#xff08;Liquid Crystal Display&#xff09;&#xff0c;液晶显示器&#xff0c;原理介绍 &#xff08;3&#xff…...

AUTOSAR从入门到精通-基于 CAN 总线的汽车发电机智能调节器(下)

目录 4.4.3 CAN 通信软件实现 汽车发电机智能调节器试验与结果分析 5.1 试验方案设计...

Windows下Tensorflow docker python开发环境搭建

前置条件 windows10 更新到较新的版本&#xff0c;硬件支持Hyper-V。 参考&#xff1a;https://learn.microsoft.com/zh-cn/windows/wsl/install 启用WSL 在Powershell中输入如下指令&#xff1a; dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsys…...

idea常用快捷键 idea搜索快捷键

常用快捷键 IntelliJ IDEA 是一款流行的 Java 集成开发环境&#xff08;IDE&#xff09;&#xff0c;有许多常用的快捷键可以帮助开发者提高效率。以下是一些常用的 IntelliJ IDEA 快捷键&#xff1a; CtrlSpace&#xff1a;基本代码补全&#xff0c;用于输入任何东西&#x…...

Redis Cluster Gossip Protocol: MEET

返回目录 CLUSTER MEET 过程说明 #mermaid-svg-dp95n6LRjBO1mCKE {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-dp95n6LRjBO1mCKE .error-icon{fill:#552222;}#mermaid-svg-dp95n6LRjBO1mCKE .error-text{fill:#…...

TcpConnection的读写操作【深度剖析】

文章目录 前言一、TcpConnection的读二、TcpConnection的写三、TcpConnection的关闭 前言 今天总结TcpConnection类的读写事件。 一、TcpConnection的读 当Poller检测到套接字的Channel处于可读状态时&#xff0c;会调用Channel的回调函数&#xff0c;回调函数中根据不同激活…...

k8s面试题

1 简述etcd及其特点 ETCD是高可用分布式的键值存储系统 特点 1)强一致性:即使部分节点故障,etcd仍能正常工作,并保持数据一致 (强一致性:分布式系统中,更新操作,所有节点读取的数据都是最新的,一致的) 2)高可用:etcd支持数据多副本复制,一个节点挂,其他节点接…...

OpenCV 4.x 版本的新特性都有哪些?

文章大纲 V 4. 0DNNV 4.0 - 4. 8cheatsheetvideo analysis参考文献与学习路径2016年的时候我快研究生毕业了,那时候OpenCV 2.4.x 版本非常的流行,当时3.x 的版本刚发布,很多人都没有用习惯。 我写过一遍笔记: OpenCV 3.0 3.1版本的改进家里还有一本书:《OpenCV 3 计算机视…...

Redisson—分布式集合

7.1. 映射&#xff08;Map&#xff09; 基于Redis的Redisson的分布式映射结构的RMap Java对象实现了java.util.concurrent.ConcurrentMap接口和java.util.Map接口。与HashMap不同的是&#xff0c;RMap保持了元素的插入顺序。该对象的最大容量受Redis限制&#xff0c;最大元素数…...

93、Redis 之 使用连接池管理Redis6.0以上的连接 及 消息的订阅与发布

★ 使用连接池管理Redis连接 从Redis 6.0开始&#xff0c;Redis可支持使用多线程来接收、处理客户端命令&#xff0c;因此应用程序可使用连接池来管理Redis连接。 上一章讲的是创建单个连接来操作redis数据库&#xff0c;这次使用连接池来操作redis数据库 Lettuce连接池 支持…...

doris动态分区开启历史分区

举例说明&#xff1a; CREATE TABLE tbl1 (k1 DATE,... ) PARTITION BY RANGE(k1) () DISTRIBUTED BY HASH(k1) PROPERTIES ("dynamic_partition.enable" "true","dynamic_partition.time_unit" "DAY","dynamic_partition.sta…...

Linux用户与权限(认知root用户、修改权限控制 - chmod、修改权限控制 - chown)

目录 1. 认知root用户 1.1 什么是root用户&#xff08;超级管理员&#xff09; 1.2 用户切换命令 1.3 sudo命令 1.3.1 为普通用户配置sudo认证 2. 用户、用户组管理 2.1 理解用户、用户组的概念 2.2 掌握用户、用户组管理的相关命令 2.2.1 用户组管理 2.2.2 …...

处理conda安装工具的动态库问题——解决记录 libssl.1.0.0 系统中所有openssl位置全览 whereis openssl

处理conda安装工具的动态库问题——解决记录 处理conda安装工具的动态库问题——解决记录 - 简书 解决libssl.so.1.0.0: cannot open shared object file: No such file or directory问题 - 简书 openssl 默认版本问题&#xff08;Anaconda相关&#xff09;_anaconda openssl-…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...