webpack学习笔记(二)核心概念理解及基础配置
上一篇文章 记录了 webpack 初次安装与基础使用,本篇则是记录一下如何使用webpack构建一个比较完整,基础的项目
1. webpack 的4个核心概念
- 入口(entry):选择项目构建的入口模块,他会根据这个文件起点构建整个项目。
- 输出(output):构建编译后文件储存的目录,可将构建后的项目输出到指定文件夹。
- loader:可以使 webpack 处理非 js 类型的文件,并进行打包构建。
- 插件(plugins):比 loader 功能更加强大,可以执行更复杂的操作。
2. 本篇目标
使用 webpack 构建一个完整的前端项目,项目内容包括 js,html/css,图片文件。使项目能够正常构建,并在内置 dev 服务器上运行起来。
需要做的事情:
- 配置入口,输入。
- 相关配置:例如上一篇说到的以生产 or 开发模式打包,配置后不需要每次在命令后加入参数。
- 配置 loader,使 webpack 能够打包 css,图片等文件。
- 配置插件,打包 html,提取 css。
- 运行项目。
注意:所有命令的执行均在项目根目录下去执行。
3. 开始搭建项目
3.1 基础构建
根据第一篇文章中的方法,我们首先创建好一个基本的项目 blog2 :

src为自定义文件夹,按照个人习惯建立以下结构:

3.2 配置前的准备
在根目录下新建 webpack.config.js 配置文件(与 package.json 同级),配置文件基础内容结构如下(官网有大量配置实例可供参考):
const path = require('path');
module.exports = {
};
注意:后续步骤中所有配置会在前一步骤配置基础上去增加,当前步骤配置会加粗,确保能够看到配置文件的整体结构,方便理解。
4. 开始配置 webpack 管理项目
4.1 入口与出口配置
const path = require('path');
module.exports = {
entry: './src/js/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'js/first-[hash].bundle.js'
}
};
entry:用来配置入口文件路径,
output:
path:保存的路径及生成的文件夹的名字,我们这里使用dist,
filename:打包后的文件的名字(可带路径,例如例子中的是打包到 dist/js 文件夹中 ),使用 [hash] 可以生成带 hash 值的名字。
4.2 配置打包模式
上一篇文章我们说到,webpack 有开发模式与生产环境,如果不进行配置,会产生警告,我们之前使用的是在命令中去携带执行参数,现在我们在配置文件中加上它,这样更加方便,配置方式如下:
const path = require('path');
module.exports = {
entry: './src/js/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'js/first-[hash].bundle.js'
},
mode: 'production'
};
mode:有两个参数,开发模式 development,生产模式 production
4.3 配置 dev 服务器
我们入口,出口配置好之后,实际上就能打包运行了。但是在上一篇中,我们测试打包完成的 js 是自己建 html 并引入进行测试的,这样肯定是不适用于开发过程中的。我们可以借助于 webpack-dev-server 来启动本地服务,并进行代码的调试。
4.3.1 下载安装
npm install webpack-dev-server -s
4.3.2 配置
const path = require('path');
module.exports = {
entry: './src/js/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'js/first-[hash].bundle.js'
},
mode: 'production',
devServer: {
contentBase: './dist',
inline: true
}
};
devServer:
contentBase:需要运行的目录
inline:是否实时更新
port:可以设置端口号
4.3.3 简化配置
正常来说我们启动的命令是:
webpack-dev-server
比较麻烦,我们可以在 package.json 中去配置一下:
在 scripts 这一项中,可以配置自定义的 npm 要执行的命令,我们在这里面加上:
"scripts": {
"dev": "webpack-dev-server --open --inline"
}
--open 代表自动打开浏览器页面 --inline 代表实时刷新
配置好后,我们在控制台输入:
npm run dev
便可以启动项目,启动后,我们实际在浏览器打开的是文件目录,并不是一个 html 页面,因为我们目前并没有打包 html 文件。
4.4 配置 loader
我们如果需要 webpack 打包非 js 文件, 我们需要进行安装配置,包括有 css,图片等文件的打包。loader 的种类非常多,可以在 官网 loaders 模块 查找到适合自己项目的 loader。我们接下来安装项目中需要的 loader:
4.4.1 下载安装:
安装 style-loader css-loader 用来打包 css 样式
npm install style-loader css-loader -s
安装 file-loader 用来打包文件
npm install file-loader -s
安装 html-withimg-loader 用来打包 html 内的图片
npm install html-withimg-loader -s
4.4.2 配置:
const path = require('path');
module.exports = {
entry: './src/js/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'js/first-[hash].bundle.js'
},
mode: 'production',
devServer: {
contentBase: './dist',
inline: true
},
module: {
rules: [
{ test: /\.css$/, use: ['style-loader', 'css-loader'] },
{ test: /\.(jpg|png|jpeg)$/, use: 'file-loader?limit=1024&name=./img/[name].[ext]' },
{ test: /\.html$/, use: 'html-withimg-loader' }
]
}
};
注意:配置时,style-loader 需要放在前面,不然会报错。
module:
rules:
test:代表匹配的文件,支持正则表达式。
use:执行相应的 loader;值后面可带参数,与 url 类似,limit 指文件大小,name 则是设置文件的路径,名字,[name] 原文件名 [ext] 原文件后缀。
4.5 配置插件 plugins
前面我们配置了 loader 使 webpack 能够打包 css,图片,我们现在配置打包 html 所需要的内容。
我们还需要在 src 目录下新建一个 index.html 文件,当作入口页面。

4.5.1 下载与安装
下载安装 html-webpack-plugin 用来打包 html 文件
npm install html-webpack-plugin -s
下载安装 extract-text-webpack-plugin 用来拆分打包 css,注意:需要安装 @next 最新版的
npm install extract-text-webpack-plugin@next -s
4.5.2 配置
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
module.exports = {
entry: './src/js/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'js/first-[hash].bundle.js'
},
mode: 'production',
devServer: {
contentBase: './dist',
inline: true
},
module: {
rules: [
{
test: /\.css$/,
use: ExtractTextPlugin.extract({
fallback: 'style-loader',
use: [{
loader: 'css-loader'
}],
publicPath: '../'
})
},
{
test: /\.(jpg|png|jpeg)$/,
use: 'file-loader?limit=1024&name=./img/[name].[ext]'
},
{
test: /\.html$/,
use: 'html-withimg-loader'
}
]
},
plugins: [
new ExtractTextPlugin('./css/[name].css'),
new HtmlWebpackPlugin({
template: './src/index.html',
filename: 'index.html',
minify:{
// 去除引号
removeAttributeQuotes: true,
// 去除注释
removeComments: true,
// 去除空属性
removeEmptyAttributes: true,
// 去除空格回车
collapseWhitespace: true
}
})
]
};
首先需要 require 引入插件,
分离 css 插件需要在 loader 设置中配合一起使用
如 ExtractTextPlugin.extract 的语法
publicPath 设置加载的路径,根据项目的路径进行调整
plugins:插件数组
new 创建 extract-text-webpack-plugin 对象
设置提取出的 css 位置与名字
new 创建 html-webpack-plugin 对象
template:使用主文件 html 的内容
import '../css/index.css'
console.log('hello word');
src/css/index.css:
body{
background-color: aquamarine;
}
#div1{
width: 200px;
height: 100px;
background-image: url('../img/1.jpg');
}
src/img/1.jpg
src/index.html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>blog2</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
</head>
<body>
<div id="div1"></div>
<div id="div2">
第二个 div
<img src="../src/img/1.jpg" alt="t1" width="300px">
</div>
</body>
</html>
启动后,效果如下:


js,css,img 都能够正常加载,说明项目已经搭建起来了,有需要的小伙伴可以下载。
6. 总结
webpack 的功能是非常非常多的,我们学习它最好的方法,就是去看文档了。当然对于我这样的小白,可能看文档根本看不懂,但是在不断的尝试过程中,慢慢的开始对 webpack 的认识变的清晰起来。我建议新学的同学也可以先在网上看看例子,有一个大致了解,知道它是什么,能够做什么,以及基本的套路之后,再去看文档,会更加得心应手。
那么本篇基于 webpack 核心概念搭建的小项目已经全部完成了,后面可能会去学一些集成其它框架或者 js 的实践了。
webpack学习笔记(二)核心概念理解及基础配置的更多相关文章
- webpack学习2.3webpack核心概念
核心概念(四个) Entry(入口) Output(出口) Loaders()来处理其他类型的资源文件 Plugins(插件) 1.入口(Entry) 作用:代码的入口,打包的入口,单个或多个, 示例 ...
- Docker 学习笔记之 核心概念
Docker核心概念: Docker Daemon Docker Container Docker Registry Docker Client 通过rest API 和Docker Daemon进程 ...
- webpack学习笔记 (二) html-webpack-plugin使用
这个插件的两个作用: 为html文件中引入的外部资源如script.link动态添加每次compile后的hash,防止引用缓存的外部文件问题 可以生成创建html入口文件,比如单页面可以生成一个ht ...
- webpack学习笔记二
sourceMap 源代码与打包后的代码的映射关系.例如,在某个源文件中test.js里面有个错误,如果开启状态,那么打包后运行的报错信息就会说明是错误的具体位置,如果是关闭状态,报错后,提示的报错位 ...
- JSP学习笔记(二):Tomcat服务器的安装及配置
一.Tomcat的下载及安装. 前往Tomcat官网下载安装包或者免安装压缩包.链接http://tomcat.apache.org/ 这里,我选择的是Tomcat8.0,而不是最新的Tomcat9. ...
- Maven学习笔记(二) :Maven的安装与配置
在Windows上安装Maven: 1. 首先检查安装JDK 通过命令行运行命令:echo %JAVA_HOME%和 java -version,能够查看当前java的安装文件夹及java的 ...
- JAVA WEB学习笔记(二):Tomcat服务器的安装及配置
一.Tomcat的下载及安装. 前往Tomcat官网下载安装包或者免安装压缩包.链接http://tomcat.apache.org/ 这里,我选择的是Tomcat8.0,而不是最新的Tomcat9. ...
- asp.net MVC日志插件Log4Net学习笔记二:保存日志到sqlserver的配置
1.写到sqlserver的配置: <!--保存到SQLSERVER数据库日志--> <log4net> <appender name="AdoNetAppen ...
- java之jvm学习笔记二(类装载器的体系结构)
java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...
- [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计
源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...
随机推荐
- JPA + MySQL 开发总结
本文为博主原创,转载请注明出处: org.springframework.data.jpa 是 Spring Data JPA 框架中的一个包,用于简化与 JPA(Java Persistence A ...
- mysql 复制表结构创建表及复制表结构与数据创建表
本文为博主原创,未经允许不得转载: 在开发过程或项目维护发布过程中,经常需要复制建表及复制表数据建表等,整理了以下四种常用的 mysql 命令. 1. create like 复制表结构(包含索引, ...
- 域名解析类型及dig,nslookup进行Dns解析过程查看
本文为博主原创,未经允许不得转载: 通常我们在windows系统下查看域名是不是可以正常访问,是通过cmd命令打开dos窗口,使用ping 命令来查看域名是不是可以正常访问,使用 ping 命令正常访 ...
- 通过 DBCA 创建 Oracle Database 21c 的进度停滞在 36%
1.问题 安装过程中一直卡在36% 检查 dbca 日志文件 位于 H:\app\trmbh\cfgtoollogs\dbca\ORCL\trace.log_2023-09-12_12-04-20PM ...
- Go——语言特性
golang 简介 来历 很久以前,有一个IT公司,这公司有个传统,允许员工拥有20%自由时间来开发实验性项目.在2007的某一天,公司的几个大牛,正在用c++开发一些比较繁琐但是核心的工作,主要包括 ...
- SpringMVC02——第一个MVC程序-配置版(low版)
配置版 新建一个子项目,添加Web支持![在MVC01中有详细方法] 确定导入了SpringMVC的依赖 配置web.xml,注册DispatcherServlet <?xml version= ...
- [转帖]linux设置page cache大小,Linux Page Cache调优在Kafka中的应用
本文首发于 vivo互联网技术 微信公众号 链接: 作者:Yang Yijun 本文主要描述Linux Page Cache优化的背景.Page Cache的基本概念.列举之前针对Kafka的 IO ...
- 开启大页与否对CacheBuffer的影响的学习
开启大页与否对CacheBuffer的影响的学习 背景 最近遇到数据库压力较高的场景. 原厂工程师到位后修改了几个参数(自己以为参数没问题) 然后最近一周环境就比较正常了. 这个地方很打脸, 自己没有 ...
- [转帖]Unix Domain Socket– IPC通信机制
什么是Unix Domain Socket 基于socket的框架上发展出一种IPC机制,就是UNIX Domain Socket.虽然网络socket也可用于同一台主机的进程间通讯(通过loopba ...
- [转帖]一文理清 TiDB 与 MySQL 中的常用字符集及排序规则
https://tidb.net/blog/0c5b6025 1.1. 字符集与编码规则 字符集(character set)即为众多字符的集合.字符集为每个字符分配一个唯一的 ID,称为 &qu ...