前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >09_Webpack打包工具

09_Webpack打包工具

作者头像
张哥编程
发布于 2024-12-13 10:52:35
发布于 2024-12-13 10:52:35
11400
代码可运行
举报
文章被收录于专栏:云计算linux云计算linux
运行总次数:0
代码可运行

1 初识Webpack

1.1 什么是Webpack

Webpack打包工具对项目中的复杂文件进行打包处理,可以实现项目的自动化构建,并且给前端开发人员带来了极大的便利。

目前,企业中的绝大多数前端项目是基于Webpack打包工具来进行开发的。

09_Webpack打包工具_前端
09_Webpack打包工具_前端
1.2 Webpack的安装与使用

使用npm包管理工具安装webpack和webpack-cli两个模块。 npm install webpack webpack-cli -D 目录下新建webpack.config.js文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 使用module.exports方式导出配置对象。
// mode用来指定构建模式
module.exports = {
    mode: 'development'
};
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// package.json
// 设置dev为webpack
// 表示当我们使用npm run dev命令时
// 就可以执行script节点下dev选项的脚本来启动Webpack对项目进行打包处理。
"dev": "webpack"

在Webpack的4.x版本中,默认约定entry打包的入口文件为src下的index.js;output打包的输出文件为dist下的main.js。

1.3 手动配置入口和出口文件

配置Webpack默认入口和出口文件配置是通过手动设置webpack.config.js文件中的配置对象的entry和output属性来定义新的入口和出口文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// webpack.config.js
// 导入操作文件路径的模块
const path = require('path');
module.exports = {
    mode: 'development',
    // 打包入口文件的路径
    entry: path.join(__dirname, './src/index.js'),
    output: {
        path: path.join(__dirname, './dist'),   // 输出文件的存放路径
        filename: 'bundle.js'                   // 输出文件的名称
    }
};
1.4 使用Webpack实现列表隔行换色效果

利用Webpack中jQuery插件来实现列表隔行换色的页面效果。

  • 安装jQuery插件
  • npm install jquery -S
  • 使用$.css()方法实现页面效果
  • 打包index.js
  • 新建index.html文件
  • 查看列表隔行换色效果
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// index.js
// 使用ES6模块化语法导入jquery插件
import $ from 'jquery';
$(function() {
    $('li:odd').css('backgroundColor', 'lightgreen');
    $('li:even').css('backgroundColor', 'lightblue');
});
1.5 Webpack与Gulp对比
  • gulp是工具链、构建工具。可以配合各种插件做js压缩,css压缩,less编译等,可以替代手工实现自动化工作;而webpack是文件打包工具,可以把项目的各种js文件、css文件等打包合并成一个或多个文件,主要用于模块化方案,预编译模块的方案。
  • 在定义和使用类比中两者都有各的用途,同时webpack为初级编译程序,gulp为高级编译程序,在功能上要比webpack应用程序中多。
  • webpack可以很方便使用node_module、es6或者样式注入等功能,作为最初级的功能定位性价比最高,webpack输入输出都以js为主,对html兼顾较少,可用组件不多很难达到可用的程度。gulp在编程方面较为复杂,但是可用的组件也会更多,手动编译的情况下耗时较长,同时此软件不适合初级入门者使用。
  • Gulp侧重于前端开发的整个过程的控制管理(像是流水线),我们可以通过给gulp配置不通的task(通过Gulp中的gulp.task()方法配置,比如启动server、sass/less预编译、文件的合并压缩等等)来让gulp实现不同的功能,从而构建整个前端开发流程。
  • Webpack,模块打包机 ,由此也可以看出Webpack更侧重于模块打包,当然我们可以把开发中的所有资源(图片、js文件、css文件等)都可以看成模块,最初Webpack本身就是为前端JS代码打包而设计的,后来被扩展到其他资源的打包处理。Webpack是通过loader(加载器)和plugins(插件)对资源进行处理的。 | | Gulp | Webpack | | — | — | — | | 定位 | 基于流的自动化构建工具 | 一个万能模块打包器 | | 目标 | 自动化和优化开发工作流,为通用 website 开发而生 | 通用模块打包加载器,为移动端大型 SPA 应用而生 | | 学习难度 | 易于学习,易于使用, api 总共只有 5 个方法 | 有大量新的概念和 api ,学习成本高 | | 适用场景 | 基于流的作业方式适合多页面应用开发 | 一切皆模块的特点适合单页面应用开发 | | 作业方式 | 对输入( gulp.src )的 js,ts,scss,less等源文件一次执行打包(bundle)、编译(complie)、压缩、重命名等处理后输出(gulp.dest)到指定目录中去,为了构建而打包 | 对入口文件( entry )递归解析生成依赖关系图,然后将所有依赖打包在一起,在打包之前会将所有依赖转译成可打包的 js 模块,为了打包而构建 | | 使用方式 | 常规 js 开发,编写一系列构建任务( task ) | 编辑各种 JSON 配置项优点 | | 优点 | 适合多页面开发,易于学习,易于使用,接口优雅 | 可以打包一切资源,适配各种模块系统 | | 缺点 | 单页面应用方面输出乏力,而且对流行的单页技术有些难以处理(比如 Vue 单文件组件,使用 gulp 处理就会很困难,而webpack 一个 Ioader 就能轻松搞定) | 不适合多页应用开发,灵活度高但同时配置很繁琐复杂。“打包一切”这个优点对于 HTTP/1.1 尤其重要,因为所有资源打包在一起能明显减少浏览器访问页面时的资源请求数量,从而减少应用程序必须等待的时间。但这个优点可能会随着 HTTP/2 的流行而变得不那么突出,因为 HTTP/2 的多路复用可以有效解决客户端并行请求时的瓶颈问题。 | | 结论 | 浏览器多页面应用(MPA)首选方案 | 浏览器单页面(SPA)首选方案 |

2 Webpack自动打包

2.1 配置webpack-dev-server

webpack-dev-server可以支持项目自动打包的工具,可以启动一个实时打包的HTTP服务器,使用webpack-dev-server来实现项目的自动打包功能。

  • 安装webpack-dev-server插件
  • npm install webpack-dev-server -D
  • 修改package.jsonscripts选项中的dev命令
  • "dev": "webpack-dev-server"
  • 自动打包bundle.js
  • npm run dev
  • 在命令执行后,会自动生成bundle.js文件,它不会放到物理磁盘上,而是放到了内存中,是一个虚拟的看不见的bundle.js文件。
  • index.html文件中引入bundle.js
  • <script src="/bundle.js"></script>
  • 引入的根目录下的bundle.js,bundle.js文件可以通过localhost:8080/bundle.js可以访问到代码。
  • 查看页面效果
2.2 配置html-webpack-plugin

html-webpack-plugin插件用来生成预览的页面。

  • 安装html-webpack-plugin插件
  • npm install html-webpack-plugin -D
  • 实例化HtmlWebpackPlugin()
  • 配置html-webpack-plugin插件
  • 重新进行打包
  • 查看页面效果
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// webpack.config.js
// 导入生成预览页面的插件,得到一个构造函数 
const HtmlWebpackPlugin = require('html-webpack-plugin');
// 创建插件的实例对象
const htmlPlugin = new HtmlWebpackPlugin({
    // 指定要用到的模板文件
    template: './src/index.html', 
    // 指定生成的文件的名称,该文件存在于内存中,在目录中不显示
    filename: 'index.html'
});
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// plugins数组是webpack打包期间会用到的一些插件列表
module.exports = {
    // 原代码
    plugins: [ htmlPlugin ]
};
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// package.json
// 修改scripts选项中的dev命令
// --open参数用来实现打包完成后自动打开浏览器页面功能
// --host参数用来配置IP地址127.0.0.1
// --port参数用来配置端口号3000。
"dev": "webpack-dev-server --open --host 127.0.0.1 --port 3000"

3 Webpack中的加载器

3.1 css-loader和style-loader加载器

在默认的情况下,Webpack能打包处理一些以.js后缀名结尾的简单模块,而其他非.js后缀名结尾的复杂模块是不能打包处理的,需要通过调用特定的加载器来打包处理相应文件模块,否则会报错。 常用加载器:

  • css-loader加载器和style-loader加载器
  • sass-loader加载器
  • less-loader加载器
  • postcss-loader加载器
  • url-loader加载器
  • babel-loader加载器

在Webpack中,同时使用css-loader和style-loader加载器来打包处理CSS文件。

  • 新建index.css
  • 初始化li元素的默认样式
  • li {list-style: none;}
  • 引入index.css
  • 引入当前目录下的css目录中的index.css模块
  • 打开index.js文件,在该文件的头部区域添加代码
  • import './css/index.css';
  • 报错是因为没有安装处理CSS文件的相关loader加载器
  • 运行报错
  • 保存文件后,查看运行结果
  • 配置loader
  • 安装style-loader和css-loader加载器,并配置loader规则
  • npm install style-loader css-loader -D
  • 查看页面效果
  • 保存文件后,使用npm run dev命令重新启动服务器
  • 打开webpack.config.js文件,添加module属性
  • “/\.css$/”表示匹配文件名后缀为.css的文件;use表示调用对应的loader加载器。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module: {
    rules: [
        {
            test: /\.css$/, 
            use: ['style-loader', 'css-loader']
        },
    ]
}
3.2 sass-loader加载器

Sass(Syntactically Awesome Stylesheets)是一个成熟、稳定、功能强大的专业级CSS扩展语言。使用Sass语言以及Sass的样式库(如 Compass)有助于更好地组织管理样式文件,并更高效地开发项目。 在Webpack中,sass-loader加载器可以用来打包处理Sass文件。

  • 在css目录中,新建index.scss文件,编写Sass代码。
  • ul {font-size: 12px; li{line-height: 30px;}}
  • 安装处理.scss文件的sass-loader加载器和node-sass模块
  • npm install sass-loader node-sass -D
  • node-sass是sass-loader的内置依赖项,当使用sass-loader时必须同时安装node-sass模块。
  • 在rules数组列表中添加处理index.scss文件的loader规则
  • 打开webpack.config.js文件
  • {test: /\.scss$/,use: ['style-loader', 'css-loader', 'sass-loader']},
  • “/\.scss$/”表示匹配文件名后缀为.scss的文件;use中的sass-loader首先被调用处理匹配到的Sass文件,然后将返回结果依次向前传递,直到结束。
  • 打开index.js文件,在该文件的头部区域添加代码
  • import './css/index.scss';
  • 使用npm run dev命令重新启动服务器
3.3 less-loader加载器

Less(Leaner Style Sheets)是一门CSS扩展语言,也称为CSS预处理器。作为CSS的一种形式的扩展,它并没有减少CSS的功能,而是在现有的CSS语法上,为CSS加入程序式语言的特性。 在Webpack中可以使用less-loader加载器来打包处理Less文件。

  • 在css目录中,新建index.less文件,编写less代码。
  • body {margin: 0;padding: 0; ul {padding: 0;margin: 0;}}
  • 安装处理.less文件的less-loader加载器和less模块
  • npm install less-loader less -D
  • less模块是less-loader加载器的内置依赖项,当使用less-loader时必须同时安装less模块。
  • 在rules数组列表中添加处理index.less文件的loader规则
  • { test: /\.less$/, use: ['style-loader', 'css-loader', 'less-loader']},
  • “/\.less$/”表示匹配文件名后缀为.less的文件,less-loader加载器用来处理匹配到的.less文件
  • 打开index.js文件,在该文件的头部区域添加代码
  • import './css/index.less';
  • 使用npm run dev命令重新启动服务器
3.4 postcss-loader加载器

PostCSS是一个用JavaScript工具和插件转换CSS代码的工具,类似于Babel对JavaScript的处理。 PostCSS的功能如下:

  • 使用下一代CSS语法
  • 自动补全浏览器的前缀
  • 自动把px单位转换成rem
  • 压缩CSS代码

autoprefixer是一个后处理程序(插件),它经常与postcss-loader加载器一起配合使用,会自动为普通的CSS添加浏览器前缀,并且支持W3C最新的规范。

  • 定义input搜索框
  • <body><input type="text" placeholder="搜索"/></body>
  • 设置input输入框的placeholder属性的值为“搜索”
  • 定义占位文本的字体颜色为红色效果
  • ::placeholder{color: red;}
  • 伪元素::placeholder选择器用来选择一个表单元素的占位文本
  • 运行程序
  • Chome浏览器中的“搜索”字体颜色显示为红色
  • IE11浏览器中的“搜索”字体颜色显示为灰色
  • 安装postcss-loader加载器和autoprefixer插件
  • npm install postcss-loader autoprefixer -D
  • postcss-loaderautoprefixer可以自动添加CSS的浏览器兼容性前缀
  • 引入autoprefixer插件,配置插件autoprefixer插件
  • 新建postcss.config.js文件,编写JavaScript代码
  • 设置属性的值为数组列表,并在数组列表挂载一个autoprefixer插件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const autoprefixer = require('autoprefixer');  // 导入自动添加前缀的插件
module.exports = {
    plugins: [ autoprefixer ]  // 挂载插件
};
  • 修改处理index.css文件的loader规则
  • 打开webpack.config.js文件,编写代码
  • { test: /\.css$/, use: ['style-loader', 'css-loader', 'postcss-loader']},
  • 在use数组的最后添加一个postcss-loader加载器用来自动为普通的CSS添加浏览器前缀
  • 使用npm run dev命令重新启动服务器
3.5 url-loader加载器

url-loader加载器用来打包处理CSS中与URL路径地址相关的图片和字体文件,并将图片和字体文件转换成为base64图片形式。

  • 定义背景图片
  • 定义id值为box的div元素
  • <body><div id="box"></div></body>
  • 设置id值为box的div元素的背景图片
  • #box{width: 580px;height: 340px;background: url('../images/1.jpg');}
  • 配置url-loader规则
  • 安装url-loaderfile-loader加载器
  • npm install url-loader file-loader -D
  • url-loaderfile-loader能处理图片和字体文件
  • 添加处理图片和字体文件的loader规则
  • 打开webpack.config.js文件,编写代码
  • {test: /\.jpg|png|gif|bmp|ttf|eot|svg|woff|woff2$/,use: 'url-loader?limit=16940'},
  • test的值表示匹配不同格式的图片和字体文件;“?”符号与参数项“limit=16940”连接。limit参数用来指定图片的大小,单位是字节(byte)。当图片小于16940时,才会被转为base64图片
  • 查看图片效果
  • 使用npm run dev命令重新启动服务器
3.6 babel-loader加载器

项目开发过程中,当编写JavaScript代码时,有时候会使用JavaScript高级语法,这些高级语法存在兼容性的问题。我们可以使用babel-loader加载器对JavaScript高级语法进行打包处理,如class语法。

  • 创建Person类
  • 使用class关键字创建Person类
  • class Person {static name = '张三'};console.log(Person.name);
  • 保存文件后,运行结果
  • 报错是因为没有安装处理JavaScript高级语法的babel-loader加载器和插件
  • 配置babel-loader规则
  • 安装babel-loader@babel/core等插件
  • npm install babel-loader @babel/core @babel/runtime -D
  • 安装处理JavaScript高级语法的插件
  • npm install @babel/preset-env @babel/plugin-transform-runtime @babel/plugin-proposal-class-properties -D
  • @babel/preset-env 是一个智能预设,可让开发人员使用最新的JavaScript,而无须微观管理目标环境所需的语法转换。
  • @babel/plugin-transform-runtime 是Babel 转换器相关的插件。
  • @babel/plugin-proposal-class-properties 插件用于编译class。
  • 初始化babel基本配置,新建babel.config.js文件,编写JavaScript代码
  • 配置对象中的presets属性的值为数组列表,并在数组中添加安装后的@babel/preset-env智能预设
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module.exports = {
    presets: [ '@babel/preset-env' ],
    plugins: [ '@babel/plugin-transform-runtime', '@babel/plugin-proposal-class-properties' ]
};
  • 添加处理JavaScript高级语法的loader规则
  • { test: /\.js$/, use: 'babel-loader', exclude: /node_modules/},
  • “/\.js$/”表示匹配文件名后缀为.js的文件,设置exclude属性的值为“/node_modules/”,表示babel-loader加载器不需要处理node_modules中的JavaScript文件。
  • 查看控制台打印结果
  • 使用npm run dev命令重新启动服务器
  • index.html文件中已经手动引入过bundle.js
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-10-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
debian12/ubuntu24/22/20 shell 脚本自动编译web安装网站环境 nginx1.26.0 php7/8 mariadb1011
#!/bin/bash# ubuntu20 shell 脚本自动编译web安装网站环境 nginx199 php7/8 mariadb1011 以 systemd 方式设置开机启动# mysql 重置 root 密码,创建 或删除 mysql 子库和子用户downdir="/datadisk/eisc/download" ; sudo mkdir -p $downdir ; sudo chmod 777 -R $downdirinstalldir="/datadisk/eisc/server" ;
eisc
2022/10/30
8440
ubuntu20/21/22 安装 qq 和 微信
#!/bin/bash # 安装微信和qq qqurl="http://work.eisc.cn/ruanjian/ubuntu/deb/work/qq/" weixinurl="http://work.eisc.cn/ruanjian/ubuntu/deb/work/weixin/" dir="/datadisk/eisc/download/weixin" debList=( linuxqq_3.1.1-11223_amd64.deb ukylin-wine_70.6.3.25_amd64.deb u
eisc
2023/04/02
1.5K0
服务器集群自动切换网络节点
eisc
2024/08/22
1490
systemd 开机启动服务
eisc
2024/03/01
2370
centos or ubuntu20/21/22 安装 vscode 配置 gcc g++ cmake 开发环境
eisc
2024/02/16
3110
软件环境编译器,自动安装c语言的 libpcap 网络抓包监控开发环境,cmake自动汇编框架shell脚本
eisc
2025/01/03
1190
ip和ip网段攻击拦截系统后端引擎-绿叶结界防火墙系统shell脚本
eisc
2024/10/30
1090
shell 脚本自动配置 gitea git 仓库
eisc
2024/11/13
1400
shell 自动导出数据库,将导出的格式为 : 数据库名+时间.sql
#!/bin/bash# databases out save# developer : eisc.cn# 开发: 小绿叶技术博客; 功能:shell 自动导出数据库,将导出的格式为 : 数据库名+时间.sql echo "linux user: $USER ; Enter the current user sudo password: " ; sudo date ; formatdate=`date +%Y.%m.%d-%H%M%S` ; echo "time year month day Hour b
eisc
2023/02/08
2.7K0
SSL VPN搭建与使用(OpenVpn)
目前腾讯云支持的SSL VPN协议只有UDP,暂不支持TCP;按照如下步骤填写本端网段(要打通的VPC网段)和对端网段(客户端内网网段),填写端口、认证算法、加密算法等信息:
RokasYang
2022/01/03
31.1K0
SSL VPN搭建与使用(OpenVpn)
企业级openvpn搭建
easy-rsa 下载地址:https://codeload.github.com/OpenVPN/easy-rsa-old/zip/master
章工运维
2023/05/19
5.4K0
OpenWRT搭建OpenVPN服务器
By HKL, on Thursday 2019-11-28 23:21, tagged: 🏷️Networking 🏷️Operating
hiplon
2023/10/18
16.8K1
OpenWRT搭建OpenVPN服务器
使用Lighthouse搭建OpenVPN轻松访问内网服务
OpenVPN是一种功能强大的开源虚拟私有网络(VPN)解决方案,可以在多种应用场景下使用。以下是几个常见的OpenVPN应用场景:
小宇-xiaoyu
2023/11/28
3K0
iPad Pro 2021使用OpenVPN Connect with ca.crt
作为新生代农民工,想必对VPN都不陌生。为了提升公司安全性,大部分互联网公司都会对公司内部平台做网络隔离(禁止公网环境随意访问),常用到的工具即OpenVPN。
阿dai学长
2021/09/08
6.9K0
LDAP 集成之 OpenVPN 篇
  公司、学校、云服务等一般需要将内外网进行分离,如果想要从外部网络访问某些内部应用,通常需要使用公司、学校、云服务提供的专用网络接入服务。国内公司、学校比较常用的是由深信服开发的 Easy Connect,一种 SSL VPN 技术的实现。虽然每年需要支付一定的费用来维护、升级 Easy Connect 服务,但是毕竟它能够提供比较细粒度的权限控制,比如说对目标 IP、目标端口的特别指定,能够有效保护内网服务器只有 Web 应用本身能被用户接入,而类似于 SSH 等服务及端口则可以通过单独申请和配置来实现。总而言之,除了需要付费,似乎没有什么不好的地方。
zhonger
2022/10/28
4.5K0
debian 12/11/10 自动切换 apt 阿里云/清华/腾讯/华为/网易163 源
eisc
2024/06/13
1.2K0
ubuntu22 编译安装docker,和docker容器方式安装 deepseek 和 webUI 配置模型
eisc
2025/02/10
4551
ubuntu22 编译安装docker,和docker容器方式安装 deepseek 和 webUI 配置模型
ubuntu 自动部署 vsftpd 服务,shell 脚本自动新增 子用户登陆
#!/bin/bash# ubuntu vsftpd installuserFile="/datadisk/eisc/ftp"# 配置用户的家目录ftp_install(){FtpPackageList=( vsftpd db-util )for i in ${FtpPackageList[*]}do FtpPackage=`sudo apt list --installed | grep $i ` if [ ${#FtpPackage} -lt 10 ] then ./ap
eisc
2022/11/11
8320
CentOS 搭建 OpenVPN 服务,一次性成功!收藏了
本篇文章包含OpenVPN应用场景,OpenVPN服务端搭建,OpenVPN客户端搭建(windows+linux),OpenVPN密码认证,手把手教大家搭建OpenVPN!
民工哥
2023/08/22
31.4K2
CentOS 搭建 OpenVPN 服务,一次性成功!收藏了
在Linux系统上搭建内网VPN
由于疫情的影响,姜同学要居家办公啦,远程桌面如teamViewer,向日葵之类用的总是不爽,姜同学虽然水平不咋地,但是怎么说也是一名程序员,该有的的极客精神还是有的,so姜同学决定在公司内网搭建vpn,快乐自己的同时也能方便其它同事,这可能就是程序员的快了吧。 于是姜同学便是踏上了漫漫的google之旅,功夫不负有心人,姜同学发现了openvpn这款产品以及Nyr大佬在github上开源的openvpn搭建脚本。
姜同学
2022/10/27
10.7K0
在Linux系统上搭建内网VPN
推荐阅读
相关推荐
debian12/ubuntu24/22/20 shell 脚本自动编译web安装网站环境 nginx1.26.0 php7/8 mariadb1011
更多 >
LV.4
这个人很懒,什么都没有留下~
目录
  • 1 初识Webpack
    • 1.1 什么是Webpack
    • 1.2 Webpack的安装与使用
    • 1.3 手动配置入口和出口文件
    • 1.4 使用Webpack实现列表隔行换色效果
    • 1.5 Webpack与Gulp对比
  • 2 Webpack自动打包
    • 2.1 配置webpack-dev-server
    • 2.2 配置html-webpack-plugin
  • 3 Webpack中的加载器
    • 3.1 css-loader和style-loader加载器
    • 3.2 sass-loader加载器
    • 3.3 less-loader加载器
    • 3.4 postcss-loader加载器
    • 3.5 url-loader加载器
    • 3.6 babel-loader加载器
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档