webpack--初试webpack( 核心、体验、资源打包)
前言
webpack是当前前端项目中最常用的资源构建工具,从本文开始,来总结记录一下关于webpack的学习。
正文
1、webpack简介
webpack官网(https://webpack.docschina.org/)
我们代码中使用less,ES6的impot以及一些高级的语法,浏览器无法识别,因此webpack解决了这个问题,它是一种前端的资源构建工具,同时也是一个静态的模块打包器。在webpack看来,前端的所有资源文件(js/img/css/less)都会作为模块处理,他会根据模块的依赖关系进行静态分析,打包生成对应的静态资源。我的理解就是,要完成这些首先要告诉weback的一个入口起点,然后根据这些依赖关系,形成一个代码块,这个代码块就叫chunk,然后根据这个chunk进行不同的处理,这一过程叫打包,打包之后,输出出来的文件叫 bundles。
2、webpack的五个核心概念
(1)Entry
入口,指示webpack以哪个文件为入口起点开始打包,但是打包之前需要分析清模块之间的依赖关系图。
(2)Output
输出,指示webpack 打包后的资源 bundles 输出到哪里,以及如何命名。
(3)Loader
Loader,指示webpack能够处理那些非 js 文件,可以理解 webpack 本身只能处理一些 js 文件,一旦处理样式文件,图片文件这些就会报错或处理不了。它就类似一个翻译官的角色。
(4)Plugins
插件,用于执行一些范围更广的任务,比如打包优化和压缩,一直到重新定义环境变量等。
(5)Mode
模式(process.env.NODE_ENV),development开发模式,能让代码在本地调试运行的环境。
production 生产模式,能让代码优化上线的运行环境。
3、webpack 安装及初体验
前提:node环境 npm安装成功
全局安装:npm install -g webpack npm i -g webpack-cli
本地安装:npm install webpack -D npm i webpack-cli -D
注意:在安装webpack的时候,如果报错如下,是自己的项目名package.json中的name值设置成了webpack
初体验,创建项目,通过 cmd 中输入 npm init 指令初始化项目,这里要注意 package.json 的 name 值问题,然后在本地安装依赖 npm i webpack-cli -D 和 npm install webpack -D ,创建src目录,在下面创建(index.js,index.css,data.json),index.js文件为项目入口文件,并分别测试css文件,json资源文件,代码如下:
index.js
// 普通js代码
function add(x,y){
return x + y
}
console.log(add(1,2)); // json资源
import data from "./data.json"
console.log(data); // 引入css资源
// import "./index.css"
index.css
body{
padding: 0;
background-color: pink;
}
data.json
{
"name":"name",
"age":18
}
分别测试下面的指令:
开发环境指令:webpack ./src/index.js -o ./build --mode=development。以 ./src/index.js 为入口 ,./build 为输出,整体打包环境是开发环境。
生产环境指令:webpack ./src/index.js -o ./build --mode=production。以 ./src/index.js 为入口 ,./build 为输出,整体打包环境是生产环境。
经测试得出结论如下:
(1)webpack能处理 js 资源,json 资源,不能处理 css 、html、和 img 资源,打包过程会报错:Module parse failed: Unexpected token (1:4)
You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
(2)生产环境比开发环境多了压缩js代码,生产环境和开发环境将es6 模块编译成浏览器能识别的模块
4.webpack打包样式资源
(1)引入css样式资源-----css-loader 和 style-loader
首先将index.js中的css引入代码注释放开
命令行执行npm i style-loader css-loader -D 命令安装开发依赖
在项目最外层创建webpack.config.js 文件,该文件为webpack配置文件,插入如下代码
// resolve用来拼接绝对路径的方法
const { resolve } = require("path"); module.exports = {
//入口文件
entry: "./src/index.js",
// 输出
output: {
// 输出文件名
filename: "build.js",
// 输出路径
// __dirname 是node.js的变量,代表当前文件的目录的绝对路径
path: resolve(__dirname, "build"), // 代表输出到当前目录下创建的build文件夹下
},
// loader的配置
module: {
rules: [
// 详细的loader配置
{
test: /\.css$/, //匹配.css结尾的文件
use: [
// 使用哪些loader进行处理,use数组中的执行顺序是从后往前
//创建一个style标签,将js中的样式资源插入进去,添加到head中生效
"style-loader",
// 将css文件编程commonjs模块加载在js中,里面内容是样式字符串
"css-loader",
],
},
],
},
//plugin的配置
//plugins: [],// 这里要注意,里面没有配置的时候要注释掉,否则会报错
// 模式
mode: "development", // 开发模式
// mode:"production"// 生产模式
};
然后执行命令 webpack即可,然后会发现控制台
接下来需要,测试引入样式是否成功,需要在build文件下创建index.html文件,并在其中引入打包之后生成的build.js,然后再浏览器打开该html文件。
(2)引入less样式资源-----less-loader
按照css资源的方式,创建index.less文件,写入样式,然后在index.js中引入,再次执行wbepack命令,发现报错如下:
上面的报错,是因为我们只配置了css样式的处理方式,没有在loader配置less的,注意:针对不同文件,需要配置不同的loader处理规则。因此需要配置less对应的解析的loader。webpack.config.js的loader.rules中添加如下代码:
{
test: /\.less$/, //匹配.less结尾的文件
use: [
"style-loader",
"css-loader",
"less-loader"// 将less文件变异成css文件
],
},
同样执行 webpack 命令
测试less打包成功方法同css。
5、webpack打包html文件----html-webpack-plugin
前面解决了样式资源的打包,都用到了 loader 来处理,都需要下载依赖,然后在loader中配置,而处理htm资源,就需要用到 plugins,需要首先下载依赖,然后 webpack 引入,最后在 plugins 中配置,如下:
同样创建 index.html 文件。
首先,下载 html-webpack-plugin : npm i html-webpak-plugin -D
然后webpack.config.js 中引入
const HtmlWebpackPlugin = require("html-webpack-plugin")
最后在plugins中配置:
//plugin的配置
plugins: [
new HtmlWebpackPlugin()
],
我并没有在index.js中引入index.html文件,同样执行 webpack 命令,会发现,打包初了生成 build.js 的输出文件外,还生成了一个空的 html 文件,并且该 html 文件引入了生成的 build.js 文件,结论:new HtmlWebpackPlugin() 默认打包生成一个空的html 文件,该文件引入打包生成的所有资源文件。但是如果我们需要设置一个html 模板文件,就需要在new HtmlWebackPlugin() 方法中传入一个参数,参数为具体的模板文件路径,如下:
plugins: [
new HtmlWebpackPlugin({
template: "./src/index.html",
}),
],
这就相当于复制了index.html文件,并自动引入打包生成的所有资源文件。
6、webpack打包图片资源----url-loader 和 file-loader
由于在webpack对html文件进行打包的时候会使用我们设置的html模板,因此我们在html文件中引入img文件无法测试对图片资源的打包,所以这里需要通过样式资源引入的方法来测试打包图片资源。
这里新建一个img文件夹,然后添加一张图片,在index.css文件中修改如下代码,并把css文件引入在index.js中
body{
padding: 0;
background-image: url(./img/webpack.jpg);
background-repeat: repeat;
}
然后安装依赖:npm i url-loader file-loader -D
最后在webpack.config.js 中配置loader:
// 这种方式无法处理html文件中的图片
{
test:/\.(jpg|png|gif)$/,
loader:"url-loader",
options:{
// 图片大小小于8kb,会被解析为base64处理,优点减少请求数量减轻服务器压力,缺点是图片体积更大,文件请求速度更慢
limit:8*1024
}
}
执行webpack打包命令,发现打包成功。
打包生成文件如下:发现图片的名字发生了变化(将图片修改成了对应的hash值)。
上面的操作只解决了css文件中引入的img文件,但是实际开发我们想在html中引入图片怎么办,由于html模板中会原封不动的打包输出,而图片的打包会经过压缩修改名称处理,所以上面的方法就不适用。需要引入 html-loader 来负责引入img图片资源,从而交给 url-loader 处理。
首先在html文件中写入
<img src="./img/webpack1.jpg" alt="" />
然后下载依赖: npm i html-loader -D
然后在webpack.config.js 中的loader配置,如下:
{
test: /\.(jpg|png|gif)$/,
loader: "url-loader",
options: {
// 图片大小小于8kb,会被解析为base64处理,优点减少请求数量减轻服务器压力,缺点是图片体积更大,文件请求速度更慢
limit: 8 * 1024,
esModule: false,
// 这样可以修改图片名称,[hash:10]表示取hash值的前十位,[ext]表示原文件扩展名
// name: "img/[hash:8].[name].[ext]",
},
},
{
// 因为url-loader默认适用了es6模块解析,而html-loader 引入图片适用commonJS处理,解析时会出现[object Module],需要关闭url-loader的es6模块化解析
test: /\.html$/,
// 处理html 文件的img文件
loader: "html-loader",
},
然后执行webpack命令,打包成功
对应的html文件中的img路径也发生了变化
7、打包其他资源---- file-loader
这里主要指其他不需要做任何优化之类的资源,这里以字体图标为例(https://www.iconfont.cn/),这里选择一个购物车图标,选择下载代码.,
下载文件并解压,打开index.html文件,会有使用图标的方法介绍,这里使用Unicode 引用
第一步:拷贝项目下面生成的 @font-face
,代码中引入了(iconfont.ttf?t=1637326208397)
@font-face {
font-family: 'iconfont';
src: url('iconfont.ttf?t=1637326208397') format('truetype');
}
第二步:定义使用 iconfont 的样式
.iconfont {
font-family: "iconfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
第三步:挑选相应图标并获取字体编码,应用于页面
<span class="iconfont">3</span>
操作:首先在src文件下创建一个icont的文件夹,把下载的 iconfont.ttf 文件复制到文件夹下,然后把第一二步的代码复制到index.css文件,把第三步的代码复制到index.html 中,最后配置loader
{// 打包其他资源(除了css,js,html资源以外的资源)
exclude:/\.(css|js|html)$/,
loader:"file-loader"
}
执行webpack命令打包结果如下:
写在最后
以上就是本文的全部内容,希望给读者带来些许的帮助和进步,方便的话点个关注,小白的成长之路会持续更新一些工作中常见的问题和技术点。
webpack--初试webpack( 核心、体验、资源打包)的更多相关文章
- 初试webpack打包
第一次接触webpack,学习了如何用webpack打包,记录一下过程. 1.在项目根目录安装webpack $ npm install webpack --save-dev 2.新建一个webpac ...
- webpack 四个核心概念
webpack 是当下最热门的前端资源模块化和打包工具.它可以将许多松散的模块(如 CommonJs 模块. AMD 模块. ES6 模块.CSS.图片. JSON.Coffeescript. LES ...
- 优雅哥学 Webpack - 01 - Webpack 5 快速体验
程序员优雅哥简介:十年程序员,呆过央企外企私企,做过前端后端架构.分享vue.Java等前后端技术和架构 本文摘要:主要讲解 webpack 5 初体验.从webpack 5 初识到便写代码.优雅哥将 ...
- 简单理解 Webpack,以及Web前端使用打包工具的原因
Java 中的模块 传统的前端开发就是 JS.HTML.CSS 三件套.Web 没有像 Java 一样拥有优秀的模块机制,就是类与类之间可以分装在不同的包下,不同包下的类互相引用时通过import导入 ...
- webpack的四大核心概念
webpack中文文档:https://doc.webpack-china.org/concepts/ 一.Entry(入口) 1.单个入口(简写)语法 // 语法 entry: string|Arr ...
- webpack安装与核心概念
安装webpack webpack核心概念:入口.输出.加载器.插件.模块.模式 一.安装webpack 1.安装webpack之前需要安装nodejs环境,在使用nodejs环境自带的包管理工具np ...
- 二、Electron + Webpack + Vue 搭建开发环境及打包安装
目录 Webpack + Vue 搭建开发环境及打包安装 ------- 打包渲染进程 Electron + Webpack 搭建开发环境及打包安装 ------- 打包主进程 Electron + ...
- 一、Electron + Webpack + Vue 搭建开发环境及打包安装
目录 Webpack + Vue 搭建开发环境及打包安装 ------- 打包渲染进程 Electron + Webpack 搭建开发环境及打包安装 ------- 打包主进程 Electron + ...
- 优化单页面开发环境:webpack与react的运行时打包与热更新
前面两篇文章介绍初步搭建单页面应用的开发环境: 第一篇:使用webpack.babel.react.antdesign配置单页面应用开发环境 第二篇:使用react-router实现单页面应用路由 这 ...
随机推荐
- FastAPI(62)- FastAPI 部署在 Docker
Docker 学习 https://www.cnblogs.com/poloyy/p/15257059.html 项目结构 . ├── app │ ├── __init__.py │ └── ma ...
- Postman快速入门
Postman是一款非常流行的支持HTTP/HTTPS协议的接口调试与测试工具,其功能非常强大,易用. 1 基础知识 1.1 下载与安装 Postman的安装步骤,本例以Windows ...
- CF1092F Tree with Maximum Cost(dfs+dp)
果然我已经菜到被\(div3\)的题虐哭了 qwq 首先看到这个题,一个比较显然的想法就是先从1号点开始\(dfs\)一遍,然后通过一些奇怪的方式,再\(dfs\)一遍得到其他点的贡献. 那么具体应该 ...
- 使用CSS选择器(第二部分)
伪类跟伪元素一样,并不是直接针对文档元素的,而是为你基于某些共同特征选择元素提供方便. 使用结构性伪类选择器 使用结构性伪类选择器能够根据元素在文档中的位置选择元素.这类选择器都有一个冒号字符前缀(: ...
- Python中生成器的理解
1.生成器的定义 在Python中一边循环一边计算的机制,称为生成器 2.为什么要有生成器 列表所有的数据都存在内存中,如果有海量的数据将非常耗内存 如:仅仅需要访问前面几个元素,那后面绝大多数元素占 ...
- 分布式表示(Distributed Representation)
NLP模型笔记 - 分布式表示 ziuno 2020-03-08 19:52:50 410 收藏 2 分类专栏: NLP 模型 笔记 文章标签: nlp 最后发布:2020-03-08 19:52:5 ...
- 改善深层神经网络-week3编程题(Tensorflow 实现手势识别 )
TensorFlow Tutorial Initialize variables Start your own session Train algorithms Implement a Neural ...
- the Agiles Scrum Meeting 4
会议时间:2020.4.12 20:00 1.每个人的工作 今天已完成的工作 yjy:基本完成广播功能,修复bug issues:小组任务1-增量开发组 Bug:冲刺 wjx:继续实现注销功能的后端 ...
- [软工顶级理解组] Alpha阶段团队贡献分评分
评分总表 下述表格适用于前端.后端.爬虫开发者的评分,基础分数为50分,在此基础上进行增减. 类别 程度 加减分 准时性 提前完成 +0 按时完成 +0 延后完成,迟交时间一天内或未延误进度 -2 延 ...
- oo第四次博客-UML暨学期总结
一. 本单元两次作业架构设计 这两次作业实际上难度不大,不存在算法上的难题,大部分时间都是用在处理UML图中各个元素的关系上. 第一次UML主要处理UML类图.有UMLclass,UMLinterfa ...