webpack打包
Webpack
官方网址:(webpack)[https://www.webpackjs.com/]
1.什么是webpack
- 它是一个模块打包器,它能够把所有的文件都当作是模块
- 它把所有的文件资源(js、json、css、sass,图片)都看作为模块
- 将这些文件资源 解析处理以后,生成对应的打包的文件
- 使用webpack构建一些应用也是非常的方便比如基于node webpack vue-cli 构建vue程序(脚手架)
-webpack 是一个基于 Node.js 运行环境。用于打包本地文件之间相互依赖并最终输出成单个文件的工具.
就像 npm 工具可以下载安装包一样.
-webpack 能够帮助我们解决模块之前相互依赖的问题.并把多个相互依赖的js文件生成一个js文件.
-- loader(加载器)
- 默认情况下,在webpack中,它只认识js文件。如果要加载其它文件
- 如果要加载其它模块的文件(.css、.jpg,json,url-loader,file-loader)
我需要使用对应的loader才可以处理。
- loader( 加载器 )
- 其它loader是webpack当中(node中)封装的一些函数
require('./a.js')
require('./data.json')
import a from "./data"
rquire('./css.css') 错的
css-loader
css-loader( './css.css' )
function css-loader( path ){
fs.readFile( path )
}
-- 其他插件
- 插件可以完成一些loader不能完成的一些任务
- 比如我要生成一个html文件,这个都需要使用对应的插件。
2.安装
全局安装在
打开cmd 运行:
2.1. npm install webpack@3 -g
npm uninstall webpack@3 :卸载安装的文件
安装在
C:\Users\sam\AppData\Roaming\npm\node_modules
2.2 在项目中 npm init -y
注意点:目录名不能是中文
package.json name :
-y 一路yes 生成package.json
2.3打包
目录结构
- webpackDemo
|- src 源文件
|-app.js入口文件
|- dist 打包生成的文件
|—bundle.js打包生成的js
|- index.html
|- webpack.config.js
|- package.json
a.js export暴露
app.js入口文件中 引入 import {a,fun} from "./a"
b.json定义了json数据
app.js入口文件中 import json form "./b" json可以随便起
打包的命令
webpack 源文件 目标文件
webpack ./src/app.js ./dist/bundle.js
bundle.js名字也是随便起的
2.4 行命令繁琐,
webpack 源文件的路径 输出的路径
webpack
入口(entry)
入口起点(entry point)指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始。进入入口起点后,webpack 会找出有哪些模块和库是入口起点(直接和间接)依赖的。
每个依赖项随即被处理,最后输出到称之为 bundles 的文件中,我们将在下一章节详细讨论这个过程。
可以通过在 webpack 配置中配置 entry 属性,来指定一个入口起点(或多个入口起点)。默认值为 ./src。
出口(output)
output 属性告诉 webpack 在哪里输出它所创建的 bundles,以及如何命名这些文件,默认值为 ./dist。基本上,整个应用程序结构,都会被编译到你指定的输出路径的文件夹中。你可以通过在配置中指定一个 output 字段,来配置这些处理过程:
webpack.config.js
简化 webpack打包
webpack配置文件
webpack.config.js
module.exports = {
//path.resolve 将相对路径的片段解析为绝对路径
//规定入口文件 c:/demo1/src/app.js
entry: path.resolve('./src/app.js'),
//出口
output:{
//出口的路径
path:path.resolve(__dirname,"./dist"),
//输出文件的名字
filename:"bundle.js"
}
};
项目根目webpack录下
运行
3.打包css
loader(加载器)
loader 让 webpack 能够去处理那些非 JavaScript 文件(webpack 自身只理解 JavaScript)。loader 可以将所有类型的文件转换为 webpack 能够处理的有效模块,然后你就可以利用 webpack 的打包能力,对它们进行处理。
本质上,webpack loader 将所有类型的文件,转换为应用程序的依赖图(和最终的 bundle)可以直接引用的模块。
在更高层面,在 webpack 的配置中 loader 有两个目标:
test 属性,用于标识出应该被对应的 loader 进行转换的某个或某些文件。
正则 匹配/\.css$/ /\.jpg|png|/
use 属性,表示进行转换时,应该使用哪个 loader。
3.安装相关包
style-loader css-loader
第一步:
npm i style-loader css-loader -D == --save-dev
-S == --save
--save 并在package文件的dependencies节点写入依赖。
--save-dev 并在package文件的devDependencies节点写入依赖
css-loader
打包时把css文件拆出来,css相关模块最终打包到一个指定
的css文件中,
我们手动用link标签去引入这个css文件就可以了
style-loader的作用
在引入css时,在最后生成的js文件中进行处理,
动态创建style标签,塞到head标签里;
第二步:
创建style.css 并书写相关样式
第三步:
app.js中引用用到的样式;
require('./style.css');
或者
import css from "./style.css"
注意:加载后缀名不能省略
第四步:
在webpack.config.js里配置loader
//module中配置的是loader 加载器
//webpack 配置中指定多个 loader
//放在output大括号结束,后面
module: {
//规则
rules: [{
//以.css为后缀名的文件 style.css
test: /\.css$/,
//使用style-loader css-loader
//loader的执行顺序是从右到左
use: ['style-loader','css-loader']
/*
css 解析css文件
style 动态的创建style标签 塞进去
*/
}]
}
loaders是一个数组,其中的元素是我们使用的所有loader,
每个loader对应一个object,test是加载器要匹配的文件后缀正则
上述loader配置表示,webpack在打包过程中,遇到后缀为css的文件,test
就会使用use
style-loader和css-loader去加载这个文件。
1.遇到后缀为.css的文件,webpack先用css-loader加载器去解析这个文件,
遇到“@import”等语句就将相应样式文件引入(所以如果没有css-loader,就没法解析这类语句),
最后计算完的css,将会使用style-loader生成一个内容为最终解析完的css代码的style标签,
放到head标签里。
2.loader是有顺序的,webpack肯定是先将所有css模块依赖解析
完得到计算结果再创建style标签。
因此应该把style-loader放在css-loader
的前面(webpack loader的
执行顺序是从右到左)。
4.打包css中的图片
下载相关包
第一步:下载url-loader file-loader
npm i url-loader file-loader -D
url-loader的作用
通过base64编码的方法来展示图片。webpack中有一个包叫做url-loader,
他可以将html以及css中的图片打包成base64
base64就是一串加密的字符串。
而且base64编码过的图片是没有http请求的
但是处理图片,它依赖于file-loader
url-loader可以将图片转为base64字符串,能更快的加载图片,一旦图片过大,
就需要使用file-loader的加载本地图片,
故url-loader可以设置图片超过多少字节时,file-loader去加载 不超过使用base64
使用url-loader
webpack.config.js中 (放在rules配置css下面)
{
test: /\.(png|jpg|gif)$/, //正则匹配png.gifjpg的图片
use: [
{
loader: 'url-loader',
options: {
limit: 400*1024 //小于8192的进行打包 图片大小
}
}
]
},
5. 压缩js文件
为什么要压缩?
在没有使用压缩功能时,文件都是原样输出的.
.css 是啥样,webpack 打包后就是啥样.
.bundle.js 是啥样 ,webpack 打包后就是啥样.
image 多大,webpack打包后就是多大.
即使是 base64,也是按照原图片尺寸大小编码的.
压缩文件可以减少文件大小,对于文本文件,
可以去除不必须要的空格和换行.对于图片文件,可以把质量调低.
文件大小小了,网络字节量也就小了.用户下载速度就会变快.
压缩js文件其实很简单.
无非就是利用 webpack 自带的
webpack.optimize.UglifyJsPlugin() 来进行压缩.
第一步:下载
npm init -y 生成package.json
安装npm i --save-dev webpack@3
在webpack.config.js文件的 plugins 节点中,
配置
new webpack.optimize.UglifyJsPlugin()
即可完成js文件压缩.
step 1.
安装 webpack@3.1.0
npm i --save-dev webpack@3.1.0
step 2.
webpack.config.js文件中新添加一个插件
var webpack = require("webpack");
//plugins: [new webpack.optimize.UglifyJsPlugin() // 压缩js文件]
plugins:[
new htmlWebpackPlugin({
//生成的html文件 不用指定输出目录 因为出门文件已经设置
filename:"a.html",
//已经有的html
template:"./index.html"
}),
new webpack.optimize.UglifyJsPlugin(),
//单独打包 生成的路径的
new ExtractTextPlugin("style.css"),
//压缩
new OptimizeCssplugin()
]
step 3.
webpack
将js进行压缩了
压缩css文件.
首先,我们需要将 css 文件单独打包.
所以要先安装 extract-text-webpack-plugin@3.0.2.
step 1.
npm i --save-dev extract-text-webpack-plugin@3.0.2
step 2.
安装压缩 css 文件的插件
npm install --save-dev optimize-css-assets-webpack-plugin@3.2.0
在 webpack.config.js 中配置这两个插件.
const ExtractTextPlugin = require('extract-text-webpack-plugin') // css文件单独打包
const OptimizeCssplugin = require('optimize-css-assets-webpack-plugin') // 压缩css文件
放到rules 把之前第一个rules下的更改了.
{
test: /\.css$/,
use: ExtractTextPlugin.extract({
fallback: 'style-loader',
use: 'css-loader'
})
},
//plugins:[ new ExtractTextPlugin('') //指定单独打包的css文件存储路径和名字 ]压缩完毕的
plugins:[
new htmlWebpackPlugin({
//生成的html文件 不用指定输出目录 因为出门文件已经设置
filename:"a.html",
//已经有的html
template:"./index.html"
}),
new webpack.optimize.UglifyJsPlugin(),
//单独打包 生成的路径的
new ExtractTextPlugin("style.css"),
//压缩
new OptimizeCssplugin()
]
step 3
webpack
成功的打包压缩了css文件
spritesmith 雪碧图
前端开发的过程中,会有很多的小图标.
一般这些小图片都是以 .png结尾的背景透明的图片.
这些小图标一般应用于一些按钮或者其他元素的图片.
比如有一个按钮,需要一个相机的小图标.
我们可能需要设置这样的 css 代码.
首先,一般这些小图片的大小都很小.
但不管有多小,都是一个http请求. background:url("./1.png")
如果页面上的需要用到小图标的地方很多.
比如有N个(假如是N张不同的小图片).
那么就会有N个请求小图标的http请求.
然而,浏览器的HTTP请求个数是有限制的.
这样做无疑会浪费HTTP请求资源.
常规做法
之前的前端会让美工把所有的小图标布局到一张图片中.
前端工程师,就根据这一张图片,来设置不同元素需要的背景图片.
这里主要是搭配 background-poistion:x,y 来设置.
具体的样式内容大概一般会是下面这个样子.
.icon-Snip20190227_108 {
background-image: url(../sprites/sprite.png);
background-position: 0px 0px;
width: 55px;
height: 55px;
}
.icon-Snip20190227_109 {
background-image: url(../sprites/sprite.png);
background-position: 0px -57px;
width: 69px;
height: 66px;
}
.icon-Snip20190227_112 {
background-image: url(../sprites/sprite.png);
background-position: 0px -125px;
width: 71px;
height: 66px;
}
.icon-Snip20190227_111 {
background-image: url(../sprites/sprite.png);
background-position: 0px -193px;
width: 67px;
height: 67px;
}
.icon-Snip20190227_110 {
background-image: url(../sprites/sprite.png);
background-position: 0px -262px;
width: 68px;
height: 68px;
}
.icon-Snip20190227_113 {
background-image: url(../sprites/sprite.png);
background-position: 0px -332px;
width: 66px;
height: 69px;
}
html中 使用
<div class="icon-Snip20190227_109"></div>
<div class="icon-Snip20190227_112"></div>
好处
图片资源只有一个,所以请求的 HTTP 只有一次.
即使第二个div的css中,又再次请求了一次
background-image: url(../sprites/sprite.png);
但实际上,这张图片已经被第一个div请求过来,
并被浏览器缓存了.所以,
第二个div背景图片资源实际上是来自浏览器缓存.
麻烦点
要事先和设计师沟通,把所有需要用到的小图标,
都集成在一张图片中.
我们需要拿到这张图片,利用 ps
等工具测量图标的大小,以及在整个图片中的 x,
y坐标.
最后,我们还需要为此编写一个特定的.css文件.
使用 webpack-spritesmith 插件
webpack-spritesmith 插件自动的把零散的小图标生成一张大图.(雪碧图)
(多个http请求变成一个)
webpack-spritesmith 插件自动测量大图的中每一个小图标的大小以及位置,
帮我们生成对应的 .css 文件.(css样式表)
(不用我们自己测量尺寸和位置以及编写.css文件)
step 1.
安装 webpack-spritesmith@1.0.0 插件
npm install webpack-spritesmith@1.0.0 --save-dev
step 2.
npm install webpack@3 --save-dev
step 3.
安装 html-wepack-plugin 插件
npm i --save-dev html-webpack-plugin@3.2.0
目的:提供 html-webpack-plugin 生成依照的模块文件index.template.html
step4.
在 webpack.config.js 中导入此插件,并设置一些此插件的相关配置.
使用 webpack-spritesmith 是帮助我们生成了一个.css文件,
而非我利用 import require 等方式导入文件.
所以 html-webpack-plugin 不会帮我们在生成的
index.html 文件里,自动导入这个样式文件.
所以,我们需要在给
html-webpack-plugin 插件提供的依赖模板中,
手动指定生成来的样式文件
所以需要设置一下 html-webpack-plugin 插件的 template 参数
//导入相关的模块
const WebpackHtmlPlugin = require('html-webpack-plugin')
const SpritesmithPlugin = require("webpack-spritesmith");
plugins: [
new SpritesmithPlugin({
//目标的小图片
src: {
//小图标的路径
cwd: path.resolve(__dirname, 'src/icons'),
//后缀名是png
glob: '*.png'
},
//生成文件的设置 生成两种东西 雪碧图 css
target: {
//生成雪碧图(大图的)文件存放路径
image: path.resolve(__dirname, 'dist/sprite/sprite.png'),
//生成的css路径
css: path.resolve(__dirname, 'dist/sprite/sprite.css')
},
//样式文件中 雪碧图的写法
apiOptions: {
cssImageRef: "./sprite.png"
},
//雪碧图生成的写法
spritesmithOptions:{
//如果排列及外边距
algorithm:"top-down",//从上到下 默认是横着的
padding:2//每个小图标之间的间隙
}
}),
//html-webpack-plugin
//自动生成html 并自动引用生成的css文件,以模板生成新的html
new WebpackHtmlPlugin({
//模板
template:"index.html",
//生成新的文件 所在路径
//注意:前边生成的雪碧图和css样式表 sprite
filename:"./sprite/a.html" //该路径参照根目录下模板index.html引入css的路径
})
]
现在开始使用
在根目录下的index.html中
<link rel="stylesheet" href="./sprite.css">
</head>
<body>
<div id="one"></div>
<div id="two"></div>
<div id="three"></div>
<div id="four"></div>
新建一个 src/app.js 作为 webpack 打包的路口文件.
在里面键入
document.getElementById('one').classList.add('icon-1')
document.getElementById('two').classList.add('icon-2')
document.getElementById('three').classList.add('icon-3')
运行
webpack
demo
|-src
|-app.js 入口文件
|-icons
|-1.png
|-2.png
|-dist
|-bundle.js
|-sprite
|-sprite.css 相应的css样式
|-sprite.png 雪碧图
|-a.html html-webpack-plguion生成的
|-index.html
|-webpack.config.js
|-package.json
|-package.lock.json

浙公网安备 33010602011771号