当前位置: 首页 > 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-…...

炸穿 2026 技术圈!AI Agent 从 0 到 1 商业落地全攻略,附 Python 可跑源码 + 双场景变现

引言:“AI Agent&#xff1a;程序员效率革命的最后一公里”前言&#xff1a;还在死磕 CRUD、熬夜改 BUG、被重复研发工作榨干精力&#xff1f;2026 年的技术风口早已彻底转向 ——AI Agent&#xff0c;从华为虚拟工程师、蘑菇物联工业智能体&#xff0c;到全行业自动化落地&…...

OpenClaw+GLM-4.7-Flash:个人网络安全监控助手

OpenClawGLM-4.7-Flash&#xff1a;个人网络安全监控助手 1. 为什么需要个人网络安全监控 去年我的开发机遭遇了一次恶意脚本攻击&#xff0c;导致本地Git仓库被篡改。事后排查发现&#xff0c;攻击者通过一个陈旧的SSH密钥漏洞入侵&#xff0c;而系统日志里其实早有异常登录…...

AI 开发实战:AI 成本监控怎么做,团队才不会越用越贵

AI 开发实战&#xff1a;AI 成本监控怎么做&#xff0c;团队才不会越用越贵 一、这个问题为什么值得专门拿出来做&#xff1f; 在 AI 工程落地里&#xff0c;真正拖慢团队的往往不是模型本身&#xff0c;而是流程和协作方式没有跟上。 围绕“AI 成本监控怎么做&#xff0c;团…...

基于智能体(Agent)的自动化图像工作流:Wan2.2-I2V-A14B与任务编排

基于智能体&#xff08;Agent&#xff09;的自动化图像工作流&#xff1a;Wan2.2-I2V-A14B与任务编排 1. 引言&#xff1a;当图像生成遇上智能体 想象一下这样的场景&#xff1a;你需要为电商平台制作一组节日主题的广告图&#xff0c;包含特定风格的背景、商品展示和人物互动…...

目前专业的LED数码管屏厂商哪家好

在现代显示技术领域&#xff0c;LED数码管屏因其高亮度、低功耗和长寿命等特点&#xff0c;广泛应用于各种电子设备中。选择一家专业的LED数码管屏厂商至关重要。本文将为您推荐几家市场上表现突出的厂商&#xff0c;并进行详细对比。1. 杭州斡能电子有限公司公司简介&#xff…...

飞书文档到Markdown的突破性转换技术:feishu2md架构深度解析

飞书文档到Markdown的突破性转换技术&#xff1a;feishu2md架构深度解析 【免费下载链接】feishu2md 一键命令下载飞书文档为 Markdown 项目地址: https://gitcode.com/gh_mirrors/fe/feishu2md 在当今企业协作环境中&#xff0c;飞书文档已成为团队知识沉淀的核心载体&…...

网页录制技术革命:为什么rrweb比传统录屏更强大?

网页录制技术革命&#xff1a;为什么rrweb比传统录屏更强大&#xff1f; 【免费下载链接】rrweb record and replay the web 项目地址: https://gitcode.com/gh_mirrors/rr/rrweb 在当今数字化时代&#xff0c;网页录制技术已经成为用户体验分析、产品演示、错误调试和在…...

Webots R2021a搭配Anaconda环境:从SSL报错到Python API调通的完整避坑指南

Webots R2021a与Anaconda环境深度整合&#xff1a;Python控制器开发全流程解析 当机器人仿真与Python开发环境相遇时&#xff0c;Webots和Anaconda的组合为研究者提供了强大工具链。然而&#xff0c;从环境配置到API调用的完整流程中&#xff0c;开发者常会遇到各种"坑点&…...

大语言模型应用落地:从RAG到工作流,IT企业智能转型全攻略!

引言检索增强生成&#xff08;RAG&#xff09;微调&#xff08;Fine-Tuning&#xff09;智能体&#xff08;Agents&#xff09;工作流与流程编排&#xff08;Workflow&#xff09;企业落地策略与阶段规划落地难点与最佳实践建议结语引言大语言模型&#xff08;LLM&#xff09;技…...

Pixel Fashion Atelier实操手册:批量生成时利用CSV导入多组Enchantment参数

Pixel Fashion Atelier实操手册&#xff1a;批量生成时利用CSV导入多组Enchantment参数 1. 引言&#xff1a;为什么需要批量生成功能 在时尚设计领域&#xff0c;设计师经常需要快速生成多个不同风格的服装设计方案。传统方式需要逐个输入参数、等待生成、再调整参数&#xf…...