前端模块化打包工具
webpack 可以处理模块之间的依赖关系,并进行打包处理
除了js文件,css、图片、json文件等都可以被当作模块来使用
打包就是将webpack中的各种资源块进行打包合并成一个或多个包(Bundle),过程中,对资源进行处理 如压缩、语法转换
gulp和webpack的区别
- gulp更加强调的是前端流程的自动化,模块化不是它的核心
- webpack更加强调模块化开发管理,文件压缩合并、预处理等 都是它附加的功能。
webpack依赖node环境
按照老师的安装的是3.6.0版本的webpack
打包过程
- install webpack
npm install webpack@3.6.0 --save-dev
- 在项目中建立文件夹和文件
|——————————————-
|————dist
|————src
|——main.js
|——mathUtils.js
|——index.html
- mathUtils.js ```javascript function add(num1, num2) { return num1+num2; } function mul(num1, num2){ return num1*num2; } // CommonJS的形式 module.exports = { add, mul };
// ES6语法 export const name = ‘nakamura’;
4. main.js
```javascript
// CommonJS的形式
const {add, mul} = require('./mathUtils')
console.log(add(23, 34));
console.log(mul(43, 2));
// ES6语法
import {name} from './mathUtils';
console.log(name);
index.js
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h2>index.html</h2>
<script src="./dist/bundle.js"></script>
</body>
</html>
在终端输入指令
webpack ./src/main.js ./dist/bundle.js
,执行打包- 运行程序,报错。好像不能混着写,单独写某一种导入导出语法都是可以的
配置webpack的入口和出口文件
- 在项目根目录新建一个文件
webpack.config.js
- 键入内容 ```javascript const path = require(“path”);
module.exports = { entry: ‘./src/main.js’, output: { path: path.join(__dirname, ‘dist’), filename: ‘bundle.js’ } }
- 再打包时,就可以直接用`webpack`指令,省去后面的两个出入口文件
**指令映射**
- 在项目的`package.json`文件中的`scripts`一项里面,加入`"build": "webpack"`
- 之后再打包时,就可以通过执行`npm run build`,即 npm run 键名
在终端使用原始指令,都会首先找全局的包<br />通过package.json添加指令映射,执行指令时,首先查找的是局部环境下的包,最好在项目中要使用的包都安装在局部环境下,并指定需要的版本
- 在安装时的指令后面加上`--save-dev`,就把安装的包放在package.json的`devDependencies` (开发时依赖的包)。
<a name="PiqDb"></a>
# 样式打包
1. css-loader,解析CSS文件后,加载,返回CSS代码
1. 按照不报错的版本 `npm install css-loader@0.28.11 --save-dev`
2. style-loader,将模块的导出作为样式添加到DOM中
1. 对应版本 `npm install style-loader@0.23.1 --save-dev`
3. 在`main.js`入口文件中添加对CSS文件的依赖`require('./css/normal.css')`
3. 在 webpack.config.js 配置文件中需要添加一项导出
```javascript
module: {
rules: [
{
test: /\.css$/,
use: [ 'style-loader', 'css-loader' ] // webpack从右向左读
}
]
}
- 打包,执行
类似地,对于less文件,安装包、添加配置、添加依赖,打包
图片处理
url-loader,
- 按照低版本的,
npm install url-loader@1.1.2 --save-dev
添加配置,webpack.config.js
在rules里面加上
{
test: /\.(png|jpg|gif)$/,
use: [
{
loader: 'url-loader',
options: {
limit: 8192
}
}
]
}
配置里面的
limit
用来设置可以加载的图片的大小,可以自己设置- 超过这个大小,就需要file-loader来加载
- 小于这个大小,会将图片编译成base64字符串形式
- 按照低版本的,
- file-loader
- 安装相应版本
npm install url-loader@2.0.0 --save-dev
- 因为页面使用的图片等通过url访问的资源,都会被放在
dist
目录下,所以需要在 webpack.config.js 配置文件的 output 一项中添加publicPath: '/dist'
- 放在dist目录下的资源,都会被自动取一个随机的名字,因此要设置一个与原文件相关的名字,且在dist里面建立图片目录,需要添加配置 在
limit
的下面,添加**name: 'img/[name].[hash:8].[ext]'**
,自定义命名规范。
- 安装相应版本
Babel loader
将ES6的语法转为ES5的语法
根据老师的版本,安装npm install --save-dev babel-loader@7.1.5 babel-core@6.26.3 babel-preset-es2015@6.24.1
添加配置,webpack.config.js
rules里面
{
test: /\.js$/,
exclude: /(node_modules|bower_components)/, // 不转化这些目录
use: {
loader: 'babel-loader',
options: {
// presets: ['@babel/preset-env']
presets: ['es2015']
}
}
}
重新打包,bundle.js文件里面的内容就变成了ES5的语法
配置 Vue
为了使项目中可以通过 import Vue from 'vue'
来使用Vue,需要通过npm安装Vue
根据老师的版本 npm install vue@2.5.21 --save
使用:
// 在main.js文件中
import Vue from 'vue';
new Vue({
el: "#app",
data: {
message: 'naka'
}
});
打包 执行,报错
vue有两种使用版本:
- runtime-only,代码中不能有任何的template,默认的根组件app都不行
- runtime-compiler,代码中可以有template,因为compiler可以用于编译template
解决,添加一个配置,webpack.config.js
// 与module同级
resolve: {
alias: {
'vue$': 'vue/dist/vue.esm.js' // 使用vue时,指定版本
}
}
webpack的plugin
打包html的plugin
将index.html也打包进dist目录,最终发布项目时,只发布dist文件夹中的内容。需要 HtmlWebpackPlugin 插件
- 自动生成一个index.html文件
- 将打包的js文件 自动通过script标签插入到body中
安装 npm install html-webpack-plugin@3.2.0 --save-dev
配置 webpack.config.js ,并给它一个生成html的模板文件
// 与module同级
plugins: [
new VueLoaderPlugin(),
new HtmlWebpackPlugin({
template: 'index.html'
})
]
还得把之前设置的一个给删掉,也在这个配置文件中,删掉output里面的 publicPath: 'dist/'
打包 执行
js压缩的plugin
将打包的js文件进行压缩处理(删除空格与空行,简写参数形式等)
安装 npm install uglifyjs-webpack-plugin@1.1.1 --save-dev
配置 webpack.config.js 在plugins里面,添加new uglifyJsPlugin()
打包 执行
使用本地服务
使用webpack提供的一个本地服务,让开发程序时,可以使浏览器自动刷新显示修改之后的效果。再在程序开发完之后,使用build打包程序。
安装 npm install webpack-dev-server@2.9.3 --save-dev
配置 webpack.config.js
// plugins同级
devServer: {
contentBase: './dist',
inline: true // 页面实时刷新
}
映射指令 package,json 。--open
是让它自动打开浏览器
"dev": "webpack-dev-server --open"
就可以通过 npm run dev 来执行程序,默认使用端口8080,通过localhost:8080
就可访问