前端模块化打包工具
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 配置文件中需要添加一项导出```javascriptmodule: {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就可访问
