webpack简单入门
webpack
1、关于webpack
什么是webpack?
webpack可以看做是将模块自动打包的工具,它会自动分析项目结构,然后将一些浏览器不能直接运行的扩展语言(TypeScript等)打包为合适的结构以便用户的浏览器能够进行解析。
为什么要用webpack?
因为在Vue中可能会用到大量的文件以及文件依赖以及项目结构,所以就推荐使用webpack来辅助打包。
怎么使用webpack
因为webpack的运行环境依赖node.js,所以需要先自行安装node.js。装好node.js之后再使用npm安装webpack
安装webpack
安装node.js完成后在windows命令行使用
node -v #查看node.js的环境变量是否生效
如果node环境安装成功,再使用
npm install webpack@3.6.0 -g
进行全局安装webpack的3.6.0版本。
2、利用webpack进行一次模块化打包
webpack可以将之前使用AMD、CommonJS、ES6规范的模块化打包方式简化,只需要将模块代码写好后利用webpack进行打包就可以了。
新建项目(项目目录结构如下)
│ index.html
│
├─dist
│ bundle.js
│
└─src
info.js
main.js
src存放开发时的源代码,dist存放经过webpack打包后的代码
新建两个js文件,其中一个导出,另外一个导入
info.js:
//定义变量
let name='测试';
let age=18;
let message='Hello!Webpack!';
//导出变量(暴露)
export {
name,age,message
}
main.js:
//从info文件中导入
import * as info from "./info";
console.log(info.name);
console.log(info.age);
console.log(info.message);
在命令行执行
webpack ./src/main.js ./dist/bundle.js
#将main.js打包成为bundle.js
这个时候webpack就会自动寻找模块之间的依赖关系(前提是代码没有错误),然后将所有的模块打包为一个bundle.js
在html里用script标签引用bundle.js
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script src="./dist/bundle.js"></script>
</body>
</html>
利用webpack打包的好处就是你只需要专注完成模块内的代码,然后最后使用webpack进行打包,然后直接在html里引用一个js文件就可以了(因为webpack会把所有模块打包成一个js)。
3、webpack的配置
因为很多时候我们的项目最好是在项目里面就配置好对应的依赖,webpack也算是项目里的依赖,就所谓的局部依赖,所以我们就需要给当前项目也要配置webpack。
引入node
因为在webpack里并不能获取当前项目的绝对路径,但是在webpack中又需要使用到它,但是node里面又有一个模块(函数)可以获得绝对路径,所以先引入node
npm init -y
npm init就是初始化node,-y参数就是全部选择默认(注意项目名不能有中文),接下来就会在项目的根目录里生成一个package.json文件,就是该项目的描述文件,里面的东西都可以自定义
{
"name": "webpackStart", #项目名称
"version": "1.0.0", #项目版本号
"description": "", #项目描述
"main": "index.js", #项目入口
"scripts": { #脚本命令
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "", #作者
"license": "ISC" #开源协议
}
编写webpack配置文件
在项目根目录里新建一个名为
webpack.config.js
文件,该文件就是webpack的配置文件,编辑如下配置://从node的系统模块中获得path
const path=require('path');
//指定webpack打包的起点(来源)和终点(目的地)
module.exports={
//起点字符串路径
entry:'./src/main.js',
//终点对象
output:{
//路径(拼接字符串)
path:path.resolve(__dirname,'dist'),
//生成的文件名
filename:'bundle.js',
},
};
第一步require(‘path’)就是从node的系统模块中获取path,和在Java中导包类似,然后再用CommonJS的方式导出,再在里面编辑起点和终点,起点直接输入相对路径的字符串,但是终点的参数就必须是个对象,然后path就是利用从node中获取的模块然后将
__dirname
和dist
拼接起来。在命名行运行webpack
然后在命令行输入
webpack
就可以看到打包成功了。
4、将webpack集成到项目中
因为大多数开发的时候每个开发人员自己本地环境中都会有一个webpack,所以最好是在项目中就直接指定webpack的版本,这样就不会每次项目从远端拉取到本地的时候使用本地的webpack打包,而是使用项目中自带的webpack打包,因为前端的依赖项中版本之间差距特别大。
将webpack安装到项目中
利用npm将webpack安装到项目中
npm install webpack@3.6.0 --save-dev
–save-dev的意思是保存到项目中并且将它设置为开发时依赖,此时项目中就会多一个
node_modules
文件夹,里面就会有咱们刚刚下载好的webpack,此时也会看到package.json文件中多了:"devDependencies": {
"webpack": "^3.6.0"
}
这就是刚刚我们下载并且指定为开发环境使用的webpack
在项目的描述文件(package.json)中配置
在项目中下载好了webpack后在package.json的scripts里配置脚本:
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack"
},
这样就可以直接在项目的命令行里输入npm run build就直接映射到webpack,并且使用项目里面的webpack进行打包了。相当于此时的
webpack
命令就被映射到了build
命令上。
5、利用webpack打包css文件
因为webpack本身是直接可以将js文件打包的,可是开发的时候我们需要打包除了js的文件怎么办呢?这个时候就需要用到各种各样的loader,比如css-loader(打包css文件)、style-loader(将css样式添加到DOM)
把项目目录改为用包装css或者js文件
│ index.html
│ package-lock.json
│ package.json
│ webpack.config.js
│
├─dist
│ bundle.js
│
└─src
│ main.js
│
├─css
│ index.css
│
└─js
info.js
可以看到css和js文件都被放到了对应的包里,而main.js(入口则是放在了外面)
写css文件
index.css:
body{
background-color: red;
}
在js中引入css
main.js:
//从info文件中导入
import * as info from "./js/info";
console.log(info.name);
console.log(info.age);
console.log(info.message);
//引入css文件
require('./css/index.css');
利用npm安装loader
因为webpack是自带将js文件打包的能力的,但是并不具备将其他文件打包的能力,所以我们需要自行安装,假如说如果只安装了css-loader,那么webpack确实具备了解析css文件的能力,但是还需要安装style-loader来将css加载到DOM上。所以:
npm install --save-dev css-loader@2.0.2
npm install --save-dev style-loader@0.23.1
分别都以dev开发环境下安装css-loader和style-loader
在webpack.config里配置刚刚安装loader
webpack.config.js:
//从node的系统模块中获得path
const path=require('path');
//指定webpack打包的起点(来源)和终点(目的地)
module.exports={
//起点字符串路径
entry:'./src/main.js',
//终点对象
output:{
//路径(拼接字符串)
path:path.resolve(__dirname,'dist'),
//生成的文件名
filename:'bundle.js',
},
module: {
rules: [
{
//正则表达式匹配所有以.css结尾的文件
test: /\.css$/,
//style-loader是将css样式作用到DOM上
//css-loader是将css文件处理
//加载的顺序是从右往左加载
use: [ 'style-loader', 'css-loader' ]
}
]
}
};
将module导出,并且在module里加载两个loader,注意加载的顺序是从右往左,所以先加载css-loader再加载style-loader
利用webpack将整个项目进行打包
最后依旧是利用webpack将整个项目打包:
npm run build
6、利用webpack打包less文件
有的时候可能需要利用webpack将less文件打包称css文件,这个时候就需要用到less-loader和less工具
写less文件
@fontSize:50px;
@fontColor:white;
body{
font-size: @fontSize;
color: @fontColor;
}
在js里面引入less
//从info文件中导入
import * as info from "./js/info";
console.log(info.name);
console.log(info.age);
console.log(info.message);
//引入css文件
require('./css/index.css');
//引入less文件
require('./css/font.less')
利用npm安装loader和less工具
npm install --save-dev less-loader@4.1.0
npm install --save-dev less@3.9.0
在webpack.config.js里配置刚刚下载好的loader
//从node的系统模块中获得path
const path=require('path');
//指定webpack打包的起点(来源)和终点(目的地)
module.exports={
//起点字符串路径
entry:'./src/main.js',
//终点对象
output:{
//路径(拼接字符串)
path:path.resolve(__dirname,'dist'),
//生成的文件名
filename:'bundle.js',
},
module: {
rules: [
{
//正则表达式匹配所有以.css结尾的文件
test: /\.css$/,
//style-loader是将css样式作用到DOM上
//css-loader是将css文件处理
//加载的顺序是从右往左加载
use: [ 'style-loader', 'css-loader' ]
},
{
//正则表达式匹配所有以.less结尾的文件
test: /\.less$/,
//加载的顺序是从右往左加载
//less-loader将less文件编译成css
//css-loader将css文件转换为浏览器可读的文件
//style-loader将样式添加到DOM上
use: [ 'style-loader', 'css-loader','less-loader' ]
}
]
}
};
利用webpack将整体项目打包
同样是利用
npm run build
将整个项目用webpack进行重新打包
7、利用webpack的url-loader打包图片资源
同样假如需要利用webpack打包图片资源的时候会分两种情况,在配置loader的时候会限定图片的大小limit,假如图片的大小小于limit那么图片在打包的时候就会被base64编码转换为字符串然后进行显示(通常用于小图片),如果图片超过limit的时候打包的时候就会直接将图片以文件的格式直接存到项目里,这个时候会利用file-loader(通常用于大图片)。保险起见,最好两种方式都使用,小图片利用url-loader打包,大图片利用file-loader打包。
- 在项目根目录新建img(自定义名)文件夹用于存放图片
在需要图片的地方引入图片
body{
/*background-color: red;*/
background: url("../img/baidu.jpg");
}
利用npm安装url-loader
npm install url-loader@1.1.2 --save-dev
依旧是在开发环境安装url-loader的1.1.2版本
在webpack.config.js里配置webpack
//从node的系统模块中获得path
const path=require('path');
//指定webpack打包的起点(来源)和终点(目的地)
module.exports={
//起点字符串路径
entry:'./src/main.js',
//终点对象
output:{
//路径(拼接字符串)
path:path.resolve(__dirname,'dist'),
//生成的文件名
filename:'bundle.js',
},
module: {
rules: [
// css-loader
{
//正则表达式匹配所有以.css结尾的文件
test: /\.css$/,
//style-loader是将css样式作用到DOM上
//css-loader是将css文件处理
//加载的顺序是从右往左加载
use: [ 'style-loader', 'css-loader' ]
},
// less-loader
{
//正则表达式匹配所有以.less结尾的文件
test: /\.less$/,
//加载的顺序是从右往左加载
//less-loader将less文件编译成css
//css-loader将css文件转换为浏览器可读的文件
//style-loader将样式添加到DOM上
/*use: [ 'style-loader', 'css-loader','less-loader' ]*/
use:[
{
loader:'style-loader'
},
{
loader:'css-loader'
},
{
loader:'less-loader'
},
]
},
// url-loader
{
// 匹配png/jpg/gif/jpeg等图片资源
test: /\.(png|jpg|gif|jpeg)$/,
use: [
{
loader: 'url-loader',
options: {
// 限制大小为20kb,默认是8kb
limit: 20480,
//name: 'img/[name].[hash:8],[ext]'
}
}
]
}
]
}
};
url-loader里有个options的limit参数,这个参数就是限制上传图片的大小,如果上传的图片小于这个大小,webpack则会将这个图片资源利用base64转码成为字符串然后在浏览器前台进行显示
利用webpack将项目整体打包
npm run build
8、利用webpack的file-loader结合url-loader打包图片资源
因为url-loader打包的图片资源会有limit限制,图片大小在limit以下的资源会被base64转换为字符串编码,而大于limit以上的资源则会被以文件的形式存到项目里面,所以这个时候就需要用到file-loader,所以url-loader和file-loader最好是同时进行使用的。
- 在项目根目录新建img包用于存放图片
- 在需要图片的地方引入图片
利用npm命令安装file-loader
npm install file-loader@3.0.1 --save-dev
在webpack.config.js里配置
//从node的系统模块中获得path
const path=require('path');
//指定webpack打包的起点(来源)和终点(目的地)
module.exports={
//起点字符串路径
entry:'./src/main.js',
//终点对象
output:{
//路径(拼接字符串)
path:path.resolve(__dirname,'dist'),
//生成的文件名
filename:'bundle.js',
// 是dist目录作为静态资源的根目录
publicPath:'dist/'
},
module: {
rules: [
// css-loader
{
//正则表达式匹配所有以.css结尾的文件
test: /\.css$/,
//style-loader是将css样式作用到DOM上
//css-loader是将css文件处理
//加载的顺序是从右往左加载
use: [ 'style-loader', 'css-loader' ]
},
// less-loader
{
//正则表达式匹配所有以.less结尾的文件
test: /\.less$/,
//加载的顺序是从右往左加载
//less-loader将less文件编译成css
//css-loader将css文件转换为浏览器可读的文件
//style-loader将样式添加到DOM上
/*use: [ 'style-loader', 'css-loader','less-loader' ]*/
use:[
{
loader:'style-loader'
},
{
loader:'css-loader'
},
{
loader:'less-loader'
},
]
},
// url-loader和file-loader
{
// 匹配png/jpg/gif/jpeg等图片资源
test: /\.(png|jpg|gif|jpeg)$/,
use: [
{
loader: 'url-loader',
options: {
// 限制大小为20kb,默认是8kb
limit: 20480,
// 打包后的图片的命名规则
name: 'img/[name]_[hash:8].[ext]'
}
}
]
}
]
}
};
因为file-loader和url-loader基本上是在一起用的,所以就可以直接写到url-loader里。同时注意name里的命名规则:
img/
表示存到终点根目录的img目录下,[name]
文件名就是原文件名,[hash:8]
表示利用hash算法存8位hash值,[ext]
表示扩展名依旧是原有扩展名。加上了hash值的目的是为了防止打包后同名的图片会进行覆盖。利用webpack命令将项目整体打包
npm run build
9、利用webpack的babel-loader将ES6语法转换为ES5
虽然现在绝大多数浏览器都已经支持ES6语法了,但是为了兼容所有浏览器,ES5的语法基本上可以在所有浏览器上运行。babel工具可以帮助我们将ES6语法的代码直接转换为ES5的代码,这样就可以保证基本上所有的浏览器都可以运行。
- 正常写ES6的代码
利用npm安装babel-loader和babel的核心工具
npm install --save-dev babel-loader@7 babel-core babel-preset-es2015
在webpack.config.js里配置
//从node的系统模块中获得path
const path=require('path');
//指定webpack打包的起点(来源)和终点(目的地)
module.exports={
//起点字符串路径
entry:'./src/main.js',
//终点对象
output:{
//路径(拼接字符串)
path:path.resolve(__dirname,'dist'),
//生成的文件名
filename:'bundle.js',
},
module: {
rules: [
{
// 匹配以.js为后缀的文件
test: /\.js$/,
// 排除(不匹配)node_modules或者bower_components
exclude: /(node_modules|bower_components)/,
use: {
loader: 'babel-loader',
options: {
presets: ['es2015']
}
}
}
]
}
};
利用webpack将整个项目打包
npm run build
还没有评论,来说两句吧...