Vue基础学习笔记Day01
-今日目标:
- 能够理解webpack基本概念和作用
- 能够掌握webpack使用步骤
- 能够使用webpack相关配置
- 能够使用webpack开发服务器
- 能够查阅使用webpack中文文档
学习内容:
学习目录:
- webpack基本概述
- webpack使用步骤
- webpack的配置
- webpack开发服务器
- 今日总结
- 面试题
铺垫
yarn包管理器
快速、可靠、安全的依赖管理工具。和 npm 类似, 都是包管理工具, 可以用于下载包, 就是比npm快,中文官网地址: /
下载yarn
下载地址:
使用yarn
常用命令如下:
# 1. 初始化, 得到package.json文件(终端路径所在文件夹下)
yarn init(npm init -y)# 2. 添加依赖(下包)
# 命令: yarn add [package]
# 命令: yarn add [package]@[version]
yarn add jquery (npm install jquery)
yarn add jquery@3.5.1 (npm install jquery@3.5.1 )# 3. 移除包
# 命令: yarn remove [package]
yarn remove jquery (npm uninstall jquery)# 4. 安装项目全部依赖(一般拿到别人的项目时, 缺少node_modules)
yarn / yarn install (npm install)
# 会根据当前项目package.json记录的包名和版本, 全部下载到当前工程中# 5. 全局
# 安装: yarn global add [package]
# 卸载: yarn global remove [package]
# 注意: global一定在add左边
yarn global add @vue/cli (npm i nodemon -g)
yarn可能遇到的问题
如果报错参考报错文档:
知识点自测
- 什么是模块, 模块化开发规范(CommonJS / ES6)
- commonJS规范:
// nodejs - commonJS规范-规定了导出和导入方式
// 导出 module.exports = {}
// 导入 const 变量 = require("模块标识")
- ES6规范
// 导出 export 或者 export default {}
// 导入 import 变量名 from '模块标识'
- 字体图标的使用
- 可以去阿里巴巴矢量图标库, 选中想要的图标, 登录后, 生成css文件和字体文件
- 下载css文件和字体文件, 也可以使用在线地址
- 在自己页面中引入iconfont.css, 并在想显示字体图标的标签上使用类名即可
- 箭头函数非常熟练
const fn = () => {}
fn()const fn2 = (a, b) => {return a + b}
fn(10, 20); // 结果是30// 当形参只有一个()可以省略
const fn3 = a => {return a * 2}
fn(50); // 结果是100// 当{}省略return也省略, 默认返回箭头后表达式结果
const fn4 = a => a * 2;
fn(50); // 结果是100
- 什么是服务器, 本地启动node服务, 服务器和浏览器关系, 服务器作用
服务器是一台性能高, 24小时可以开机的电脑服务器可以提供服务(例如: 文件存储, 网页浏览, 资源返回)在window电脑里安装node后, 可以编写代码用node 启动一个web服务, 来读取本地html文件, 返回给浏览器查看浏览器 -> 请求资源 -> 服务器浏览器 <- 响应数据 <- 服务器
-
开发环境 和 生产环境 以及英文"development", “production” 2个单词尽量会写会读
-
初始化包环境和package.json文件作用
npm下载的包和对应版本号, 都会记录到下载包时终端所在文件夹下的package.json文件里
- package.json中的dependencies和 devDependencies区别和作用
* dependencies 别人使用你的项目必须下载的依赖, 比如yarn add jquery* devDependencies 开发你的项目需要依赖的包, 比如yarn add webpack webpack-cli -D (-D 相当于 --save-dev)
- 终端的熟练使用: 切换路径, 清屏, 包下载命令等
切换路径 cd 清屏 cls 或者 clear
- 对base64字符串, 图片转base64字符串了解
在线装换图片/
0. webpack_为何学
- package:打包
- webpack:web项目打包工具
问题
- 我们为什么要学习webpack?
答案
- 我们为什么要学习webpack?
- 减少文件数量
- 缩减代码体积
- 提高浏览器打开的速度
1. webpack基本概述
- webpack本质是,node的一个第三方模块包, 用于打包代码(打包工具)
- webpack官网 /
- 现代 javascript 应用程序的 静态模块打包器 (module bundler)
- 为要学的 vue-cli 开发环境做铺垫
webpack能做什么
把很多文件打包整合到一起, 缩小项目体积, 提高加载速度
问题
- 什么是webpack?作用是?目的是?
答案
- 什么是webpack?作用是?目的是?
- 它是一个Node的第三方模块
- 作用是识别代码,翻译,压缩,整合打包
- 提高打开网站的速度
2. webpack的使用步骤
2.0_webpack基础使用
2.0.1 使用前准备工作
- 目标: 把src下的2个js文件, 打包到1个js中, 并输出到默认dist目录下
默认入口: ./src/index.js默认出口: ./dist/main.js==注意:路径上, 文件夹, 文件名不能叫webpack/其他已知的模块名==
- 具体步骤
- 初始化包环境(在新建的“01_webpack的基本使用”文件夹中执行)
yarn init
# 等同于npm init
- 安装依赖包
yarn add webpack webpack-cli -D
# 等同于npm install webpack webpack-cli -D
# 包与包之间用空格分隔
# -D 安装在开发依赖中,package.json的devDependencies中
# -S 安装在线上(核心)依赖中,package.json的dependencies# webpack-cli : webpack的命令行工具,里边提供了操作webpack的各种命令,用来管理webpack,打包项目
# cli : command line interface 命令行界面,命令行工具
- 配置scripts(自定义命令)
"scripts": {"build": "webpack"}
#以上只有build的自定义的,但是建议叫build:构建,编译项目 (打包项目)
使用webpack需要做哪些准备工作?
- 初始化包环境,得到package.json文件
- 下载webpack等模块
- 在package.json自定义命令,为打包做准备
bug补充:
在执行yarn命令的时候,可能会出现如下错误:
- 错误描述:node版本问题。期望的版本是10,12,等等,但是得到的是15.0.0
- 解决:
- yarn config set ignore-engines true(忽略引擎版本检查)
- 或者更换其他版本的node
2.0.2 基本使用-打包2个js文件
需求:将俩js文件打包一下
- 新建目录src(在01_webpack的基本使用目录下新建)
- 新建src/add/add.js - 定义求和函数导出
export const addFn = (a, b) => a + b
- 新建src/index.js导入使用
import {addFn} from './add/add' //add.js的.js后缀可以省略console.log(addFn(10, 20));
- 运行打包命令:注意执行此命令必须在项目根路径执行(src的父级目录)
yarn build
#或者 npm run build开发环境:development
生产环境:production
- 效果: src并列处, 生成默认dist目录和打包后默认main.js文件
webpack如何使用呢?
- 默认src/index.js - 打包入口文件
- 需要引入到入口的文件才会参与打包
- 执行package.json里的build命令,间接执行webpack打包命令
- 默认输出dist/main.js的打包结果
2.1_webpack 更新打包
目标: 以后代码变更, 如何重新打包呢
- 复制第一个项目,改名为:02_webpack更新打包
- 新建src/tool/tool.js - 定义导出数组求和方法
export const getArrSum = arr => arr.reduce((sum, val) => sum += val, 0)
#reduce遍历数组,累计求和
#第一个参数,回调函数:(sum, val) => sum += val
#第二个参数,sum的初始值
#返回值,返回sum
var arr = [1,2,3,4];
arr.reduce(function(sum,val){ //第一个参数,回调函数 , 计算数组元素和sum += val},0 // 第二个形参是sum的初始值
)
reduce:减少;降低;把…分解
- src/index.js - 导入使用
import {addFn} from './add/add'
import {getArrSum} from './tool/tool'console.log(addFn(10, 20));
console.log(getArrSum([1, 2, 3]));
- 重新打包
yarn build
- 效果
总结1: src是开发目录, dist是打包后目录, 是独立开来的
总结2: 打包后格式压缩(没有空格,回车), 变量压缩(变为单个字母:o,e)等
代码增加后,如何打包呢?
- 确保在src/index.js引入和使用
- 重新执行yarn build打包命令
3. webpack的配置
3.0_webpack-入口和出口
目标: 告诉webpack从哪开始打包, 打包后输出到哪里
- 配置文档:
- 默认入口: ./src/index.js
- 默认出口: ./dist/main.js
- webpack配置 - webpack.config.js(默认)
- 复制上一个项目,改名为03_webpack配置_修改入口和出口
- 然后在src并列处(项目根目录)新建, webpack.config.js
- 填入配置项
const path = require("path")module.exports = {entry: "./src/main.js", // 入口,./代表当前文件所在的文件夹output: { path: path.resolve(__dirname, "dist"), // 出口路径,__dirname获取当前文件所在文件夹的绝对路径filename: "bundle.js" // 出口文件名}
}
// 路径注意:
// entry:可以接收相对路径
// 而output的path是需要绝对路径的,那么我们这里就借用path来获取项目的绝对路径
console.log(__dirname); //__dirname总是指向当前文件的绝对路径console.log(path.join(__dirname, '/dist'));//join会将__dirname与dist以\拼接
console.log(path.resolve(__dirname, '/dist'));//把一个路径或路径片段的序列解析为一个绝对路径
--------------------------------打印如下-----------------------------
D:\czfront_code\vue_base_new\day01\03_webpack配置_修改入口和出口
D:\czfront_code\vue_base_new\day01\03_webpack配置_修改入口和出口\dist
D:\dist
- 将src下的index.js修改名为main.js
- 修改package.json, 自定义打包命令 - 让webpack使用配置文件
"scripts": {"build": "webpack"
},
- 如何修改webpack入口和出口?
- 新建webpack.config.js(webpack默认配置文件名)
- 通过entry设置入口文件路径
- 通过output对象设置出口路径和文件名
- 一句话总结下yarn build后干了什么?
- 执行webpack命令,找到配置文件,入口和依赖关系,打包代码输出到指定位置
- 所有想要被打包的文件应该怎样处理?
- 所有要被打包的资源都要跟入口产生直接或间接的引用关系
3.2_案例-webpack隔行变色
目标: 工程化模块化开发前端项目, webpack会对ES6模块化处理
-
需求: 新建项目, yarn下载jquery, 然后模块化引入到js中, 编写jq代码实现隔行变色
-
步骤:
- 回顾从0准备环境
- 初始化包环境
- 下载依赖包:webpack,webpack-cli
- 配置自定义打包命令:build
- 下载jquery, 新建public/index.html
yarn add jquery
- index.html 准备一些li
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
</head>
<body><div id="app"><!-- ul>li{我是第$个li}*10 --><ul><li>我是第1个li</li><li>我是第2个li</li><li>我是第3个li</li><li>我是第4个li</li><li>我是第5个li</li><li>我是第6个li</li><li>我是第7个li</li><li>我是第8个li</li><li>我是第9个li</li></ul>
</div></body>
</html>
- 在src/main.js引入jquery
import $ from 'jquery'
- src/main.js中编写隔行变色代码
$(function() {$('#app li:nth-child(odd)').css('color', 'red')$('#app li:nth-child(even)').css('color', 'green')
})
- 执行打包命令观察效果
- 可以在dist下把public/index.html引入过来
//注意在ul下方引入
<script src="./bundle.js"></script>
注意:
- 因为import语法浏览器支持性不好, 所以不能直接在index.html中引入main.js
- main.js需要被webpack转换后, 才能引用
- webpack可以将import这些兼容性有问题的es6高级语法,转换为没有兼容性的语法
总结: 前端工程化模块化, 需要的包yarn下, 被webpack打包后引入到html中使用
用yarn下的包,如何作用在前端项目中?
- 借助webpack,把模块和代码打包
- 把js文件引入到html执行查看效果
3.3_插件-自动生成html文件
目标: html-webpack-plugin插件, 让webpack打包后生成html文件并自动引入打包后的js
- html-webpack-plugin插件地址
- 下载插件
yarn add html-webpack-plugin -D
- webpack.config.js配置
// 引入自动生成 html 的插件
const HtmlWebpackPlugin = require('html-webpack-plugin')module.exports = {// ...省略其他代码plugins: [// plugins插件配置new HtmlWebpackPlugin({template: './public/index.html' // 告诉webpack使用插件时, 以我们自己的html文件作为模板去生成dist/html文件})]
}
- 重新打包后观察dist下是否多出html并运行看效果
- 打包后的index.html自动引入打包后的js文件
- 访问dist目录即可:访问任何一个目录,浏览器会默认打开此目录下的index.html文件
总结: webpack就像一个人, webpack.config.js是人物属性, 给它穿什么装备它就干什么活
如何让webpack打包时自动生成html文件呢?
- 依赖html-webpack-plugin插件,yarn下载此插件
- 在webpack.config.js配置文件写入即可
断更
今日总结
- 什么是webpack, 它有什么作用
- 知道yarn的使用过程, 自定义命令, 下载删除包
- 有了webpack让模块化开发前端项目成为了可能, 底层需要node支持
- 对webpack各种配置项了解
- 入口/出口
- 插件
- 加载器
- mode模式
- devServer
- webpack开发服务器的使用和运作过程
面试题
1、什么是webpack(必会)
webpack是一个打包模块化javascript的工具,在webpack里一切文件皆模块,通过loader转换文件,通过plugin注入钩子,最后输出由多个模块组合成的文件,webpack专注构建模块化项目
2、Webpack的优点是什么?(必会)
- 专注于处理模块化的项目,能做到开箱即用,一步到位
- 通过plugin扩展,完整好用又不失灵活
- 通过loaders扩展, 可以让webpack把所有类型的文件都解析打包
- 区庞大活跃,经常引入紧跟时代发展的新特性,能为大多数场景找到已有的开源扩展
3、webpack的构建流程是什么?从读取配置到输出文件这个过程尽量说全(必会)
Webpack 的运行流程是一个串行的过程,从启动到结束会依次执行以下流程:1. 初始化参数:从配置文件读取与合并参数,得出最终的参数
- 开始编译:用上一步得到的参数初始化 Compiler 对象,加载所有配置的插件,开始执行编译
- 确定入口:根据配置中的 entry 找出所有的入口文件
- 编译模块:从入口文件出发,调用所有配置的 Loader 对模块进行翻译,再找出该模块依赖的模块,再递归本步骤直到所有入口依赖的文件都经过了本步骤的处理
- 完成模块编译:在经过第4步使用 Loader 翻译完所有模块后,得到了每个模块被翻译后的最终内容以及它们之间的依赖关系
- 输出资源:根据入口和模块之间的依赖关系,组装成一个个包含多个模块的 Chunk,再把每个 Chunk 转换成一个单独的文件加入到输出列表,这步是可以修改输出内容的最后机会
- 输出完成:在确定好输出内容后,根据配置确定输出的路径和文件名,把文件内容写入到文件系统。
在以上过程中,Webpack 会在特定的时间点广播出特定的事件,插件在监听到感兴趣的事件后会执行特定的逻辑,并且插件可以调用 Webpack 提供的 API 改变 Webpack 的运行结果
4、说一下 Webpack 的热更新原理(必会)
webpack 的热更新又称热替换(Hot Module Replacement),缩写为 HMR。这个机制可以做到不用刷新浏览器而将新变更的模块替换掉旧的模块。HMR的核心就是客户端从服务端拉去更新后的文件,准确的说是 chunk diff (chunk 需要更新的部分),实际上 WDS 与浏览器之间维护了一个 Websocket,当本地资源发生变化时,WDS 会向浏览器推送更新,并带上构建时的 hash,让客户端与上一次资源进行对比。客户端对比出差异后会向 WDS 发起 Ajax 请求来获取更改内容(文件列表、hash),这样客户端就可以再借助这些信息继续向 WDS 发起 jsonp 请求获取该chunk的增量更新。后续的部分(拿到增量更新之后如何处理?哪些状态该保留?哪些又需要更新?)由 HotModulePlugin 来完成,提供了相关 API 以供开发者针对自身场景进行处理,像react-hot-loader 和 vue-loader 都是借助这些 API 实现 HMR。
5、webpack与grunt、gulp的不同?(必会)
1) 三者之间的区别三者都是前端构建工具,grunt和gulp在早期比较流行,现在webpack相对来说比较主流,不过一些轻量化的任务还是会用gulp来处理,比如单独打包CSS文件等。grunt和gulp是基于任务和流(Task、Stream)的。类似jQuery,找到一个(或一类)文件,对其做一系列链式操作,更新流上的数据, 整条链式操作构成了一个任务,多个任务就构成了整个web的构建流程。webpack是基于入口的。webpack会自动地递归解析入口所需要加载的所有资源文件,然后用不同的Loader来处理不同的文件,用Plugin来扩展webpack功能。2) 从构建思路来说gulp和grunt需要开发者将整个前端构建过程拆分成多个Task,并合理控制所有Task的调用关系 webpack需要开发者找到入口,并需要清楚对于不同的资源应该使用什么Loader做何种解析和加工3) 对于知识背景来说gulp更像后端开发者的思路,需要对于整个流程了如指掌 webpack更倾向于前端开发者的思路
6、有哪些常见的Loader?他们是解决什么问题的?(必会)
1、 file-loader:把文件输出到一个文件夹中,在代码中通过相对 URL 去引用输出的文件
2、 url-loader:和 file-loader 类似,但是能在文件很小的情况下以 base64 的方式把文件内容注入到代码中去
3、 source-map-loader:加载额外的 Source Map 文件,以方便断点调试
4、 image-loader:加载并且压缩图片文件
5、 babel-loader:把 ES6 转换成 ES5
6、 css-loader:加载 CSS,支持模块化、压缩、文件导入等特性
7、 style-loader:把 CSS 代码注入到 JavaScript 中,通过 DOM 操作去加载 CSS。
8、 eslint-loader:通过 ESLint 检查 JavaScript 代码
7、Loader和Plugin的不同?(必会)
1) 不同的作用Loader直译为"加载器"。Webpack将一切文件视为模块,但是webpack原生是只能解析js文件,如果想将其他文件也打包的话,就会用到loader。 所以Loader的作用是让webpack拥有了加载和解析非JavaScript文件的能力。Plugin直译为"插件"。Plugin可以扩展webpack的功能,让webpack具有更多的灵活性。 在 Webpack 运行的生命周期中会广播出许多事件,Plugin 可以监听这些事件,在合适的时机通过 Webpack 提供的 API 改变输出结果。
-
不同的用法
Loader在module.rules中配置,也就是说他作为模块的解析规则而存在。 类型为数组,每一项都是一个Object,里面描述了对于什么类型的文件(test),使用什么加载(loader)和使用的参数(options)
Plugin在plugins中单独配置。 类型为数组,每一项是一个plugin的实例,参数都通过构造函数传入。
Vue基础学习笔记Day01
-今日目标:
- 能够理解webpack基本概念和作用
- 能够掌握webpack使用步骤
- 能够使用webpack相关配置
- 能够使用webpack开发服务器
- 能够查阅使用webpack中文文档
学习内容:
学习目录:
- webpack基本概述
- webpack使用步骤
- webpack的配置
- webpack开发服务器
- 今日总结
- 面试题
铺垫
yarn包管理器
快速、可靠、安全的依赖管理工具。和 npm 类似, 都是包管理工具, 可以用于下载包, 就是比npm快,中文官网地址: /
下载yarn
下载地址:
使用yarn
常用命令如下:
# 1. 初始化, 得到package.json文件(终端路径所在文件夹下)
yarn init(npm init -y)# 2. 添加依赖(下包)
# 命令: yarn add [package]
# 命令: yarn add [package]@[version]
yarn add jquery (npm install jquery)
yarn add jquery@3.5.1 (npm install jquery@3.5.1 )# 3. 移除包
# 命令: yarn remove [package]
yarn remove jquery (npm uninstall jquery)# 4. 安装项目全部依赖(一般拿到别人的项目时, 缺少node_modules)
yarn / yarn install (npm install)
# 会根据当前项目package.json记录的包名和版本, 全部下载到当前工程中# 5. 全局
# 安装: yarn global add [package]
# 卸载: yarn global remove [package]
# 注意: global一定在add左边
yarn global add @vue/cli (npm i nodemon -g)
yarn可能遇到的问题
如果报错参考报错文档:
知识点自测
- 什么是模块, 模块化开发规范(CommonJS / ES6)
- commonJS规范:
// nodejs - commonJS规范-规定了导出和导入方式
// 导出 module.exports = {}
// 导入 const 变量 = require("模块标识")
- ES6规范
// 导出 export 或者 export default {}
// 导入 import 变量名 from '模块标识'
- 字体图标的使用
- 可以去阿里巴巴矢量图标库, 选中想要的图标, 登录后, 生成css文件和字体文件
- 下载css文件和字体文件, 也可以使用在线地址
- 在自己页面中引入iconfont.css, 并在想显示字体图标的标签上使用类名即可
- 箭头函数非常熟练
const fn = () => {}
fn()const fn2 = (a, b) => {return a + b}
fn(10, 20); // 结果是30// 当形参只有一个()可以省略
const fn3 = a => {return a * 2}
fn(50); // 结果是100// 当{}省略return也省略, 默认返回箭头后表达式结果
const fn4 = a => a * 2;
fn(50); // 结果是100
- 什么是服务器, 本地启动node服务, 服务器和浏览器关系, 服务器作用
服务器是一台性能高, 24小时可以开机的电脑服务器可以提供服务(例如: 文件存储, 网页浏览, 资源返回)在window电脑里安装node后, 可以编写代码用node 启动一个web服务, 来读取本地html文件, 返回给浏览器查看浏览器 -> 请求资源 -> 服务器浏览器 <- 响应数据 <- 服务器
-
开发环境 和 生产环境 以及英文"development", “production” 2个单词尽量会写会读
-
初始化包环境和package.json文件作用
npm下载的包和对应版本号, 都会记录到下载包时终端所在文件夹下的package.json文件里
- package.json中的dependencies和 devDependencies区别和作用
* dependencies 别人使用你的项目必须下载的依赖, 比如yarn add jquery* devDependencies 开发你的项目需要依赖的包, 比如yarn add webpack webpack-cli -D (-D 相当于 --save-dev)
- 终端的熟练使用: 切换路径, 清屏, 包下载命令等
切换路径 cd 清屏 cls 或者 clear
- 对base64字符串, 图片转base64字符串了解
在线装换图片/
0. webpack_为何学
- package:打包
- webpack:web项目打包工具
问题
- 我们为什么要学习webpack?
答案
- 我们为什么要学习webpack?
- 减少文件数量
- 缩减代码体积
- 提高浏览器打开的速度
1. webpack基本概述
- webpack本质是,node的一个第三方模块包, 用于打包代码(打包工具)
- webpack官网 /
- 现代 javascript 应用程序的 静态模块打包器 (module bundler)
- 为要学的 vue-cli 开发环境做铺垫
webpack能做什么
把很多文件打包整合到一起, 缩小项目体积, 提高加载速度
问题
- 什么是webpack?作用是?目的是?
答案
- 什么是webpack?作用是?目的是?
- 它是一个Node的第三方模块
- 作用是识别代码,翻译,压缩,整合打包
- 提高打开网站的速度
2. webpack的使用步骤
2.0_webpack基础使用
2.0.1 使用前准备工作
- 目标: 把src下的2个js文件, 打包到1个js中, 并输出到默认dist目录下
默认入口: ./src/index.js默认出口: ./dist/main.js==注意:路径上, 文件夹, 文件名不能叫webpack/其他已知的模块名==
- 具体步骤
- 初始化包环境(在新建的“01_webpack的基本使用”文件夹中执行)
yarn init
# 等同于npm init
- 安装依赖包
yarn add webpack webpack-cli -D
# 等同于npm install webpack webpack-cli -D
# 包与包之间用空格分隔
# -D 安装在开发依赖中,package.json的devDependencies中
# -S 安装在线上(核心)依赖中,package.json的dependencies# webpack-cli : webpack的命令行工具,里边提供了操作webpack的各种命令,用来管理webpack,打包项目
# cli : command line interface 命令行界面,命令行工具
- 配置scripts(自定义命令)
"scripts": {"build": "webpack"}
#以上只有build的自定义的,但是建议叫build:构建,编译项目 (打包项目)
使用webpack需要做哪些准备工作?
- 初始化包环境,得到package.json文件
- 下载webpack等模块
- 在package.json自定义命令,为打包做准备
bug补充:
在执行yarn命令的时候,可能会出现如下错误:
- 错误描述:node版本问题。期望的版本是10,12,等等,但是得到的是15.0.0
- 解决:
- yarn config set ignore-engines true(忽略引擎版本检查)
- 或者更换其他版本的node
2.0.2 基本使用-打包2个js文件
需求:将俩js文件打包一下
- 新建目录src(在01_webpack的基本使用目录下新建)
- 新建src/add/add.js - 定义求和函数导出
export const addFn = (a, b) => a + b
- 新建src/index.js导入使用
import {addFn} from './add/add' //add.js的.js后缀可以省略console.log(addFn(10, 20));
- 运行打包命令:注意执行此命令必须在项目根路径执行(src的父级目录)
yarn build
#或者 npm run build开发环境:development
生产环境:production
- 效果: src并列处, 生成默认dist目录和打包后默认main.js文件
webpack如何使用呢?
- 默认src/index.js - 打包入口文件
- 需要引入到入口的文件才会参与打包
- 执行package.json里的build命令,间接执行webpack打包命令
- 默认输出dist/main.js的打包结果
2.1_webpack 更新打包
目标: 以后代码变更, 如何重新打包呢
- 复制第一个项目,改名为:02_webpack更新打包
- 新建src/tool/tool.js - 定义导出数组求和方法
export const getArrSum = arr => arr.reduce((sum, val) => sum += val, 0)
#reduce遍历数组,累计求和
#第一个参数,回调函数:(sum, val) => sum += val
#第二个参数,sum的初始值
#返回值,返回sum
var arr = [1,2,3,4];
arr.reduce(function(sum,val){ //第一个参数,回调函数 , 计算数组元素和sum += val},0 // 第二个形参是sum的初始值
)
reduce:减少;降低;把…分解
- src/index.js - 导入使用
import {addFn} from './add/add'
import {getArrSum} from './tool/tool'console.log(addFn(10, 20));
console.log(getArrSum([1, 2, 3]));
- 重新打包
yarn build
- 效果
总结1: src是开发目录, dist是打包后目录, 是独立开来的
总结2: 打包后格式压缩(没有空格,回车), 变量压缩(变为单个字母:o,e)等
代码增加后,如何打包呢?
- 确保在src/index.js引入和使用
- 重新执行yarn build打包命令
3. webpack的配置
3.0_webpack-入口和出口
目标: 告诉webpack从哪开始打包, 打包后输出到哪里
- 配置文档:
- 默认入口: ./src/index.js
- 默认出口: ./dist/main.js
- webpack配置 - webpack.config.js(默认)
- 复制上一个项目,改名为03_webpack配置_修改入口和出口
- 然后在src并列处(项目根目录)新建, webpack.config.js
- 填入配置项
const path = require("path")module.exports = {entry: "./src/main.js", // 入口,./代表当前文件所在的文件夹output: { path: path.resolve(__dirname, "dist"), // 出口路径,__dirname获取当前文件所在文件夹的绝对路径filename: "bundle.js" // 出口文件名}
}
// 路径注意:
// entry:可以接收相对路径
// 而output的path是需要绝对路径的,那么我们这里就借用path来获取项目的绝对路径
console.log(__dirname); //__dirname总是指向当前文件的绝对路径console.log(path.join(__dirname, '/dist'));//join会将__dirname与dist以\拼接
console.log(path.resolve(__dirname, '/dist'));//把一个路径或路径片段的序列解析为一个绝对路径
--------------------------------打印如下-----------------------------
D:\czfront_code\vue_base_new\day01\03_webpack配置_修改入口和出口
D:\czfront_code\vue_base_new\day01\03_webpack配置_修改入口和出口\dist
D:\dist
- 将src下的index.js修改名为main.js
- 修改package.json, 自定义打包命令 - 让webpack使用配置文件
"scripts": {"build": "webpack"
},
- 如何修改webpack入口和出口?
- 新建webpack.config.js(webpack默认配置文件名)
- 通过entry设置入口文件路径
- 通过output对象设置出口路径和文件名
- 一句话总结下yarn build后干了什么?
- 执行webpack命令,找到配置文件,入口和依赖关系,打包代码输出到指定位置
- 所有想要被打包的文件应该怎样处理?
- 所有要被打包的资源都要跟入口产生直接或间接的引用关系
3.2_案例-webpack隔行变色
目标: 工程化模块化开发前端项目, webpack会对ES6模块化处理
-
需求: 新建项目, yarn下载jquery, 然后模块化引入到js中, 编写jq代码实现隔行变色
-
步骤:
- 回顾从0准备环境
- 初始化包环境
- 下载依赖包:webpack,webpack-cli
- 配置自定义打包命令:build
- 下载jquery, 新建public/index.html
yarn add jquery
- index.html 准备一些li
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
</head>
<body><div id="app"><!-- ul>li{我是第$个li}*10 --><ul><li>我是第1个li</li><li>我是第2个li</li><li>我是第3个li</li><li>我是第4个li</li><li>我是第5个li</li><li>我是第6个li</li><li>我是第7个li</li><li>我是第8个li</li><li>我是第9个li</li></ul>
</div></body>
</html>
- 在src/main.js引入jquery
import $ from 'jquery'
- src/main.js中编写隔行变色代码
$(function() {$('#app li:nth-child(odd)').css('color', 'red')$('#app li:nth-child(even)').css('color', 'green')
})
- 执行打包命令观察效果
- 可以在dist下把public/index.html引入过来
//注意在ul下方引入
<script src="./bundle.js"></script>
注意:
- 因为import语法浏览器支持性不好, 所以不能直接在index.html中引入main.js
- main.js需要被webpack转换后, 才能引用
- webpack可以将import这些兼容性有问题的es6高级语法,转换为没有兼容性的语法
总结: 前端工程化模块化, 需要的包yarn下, 被webpack打包后引入到html中使用
用yarn下的包,如何作用在前端项目中?
- 借助webpack,把模块和代码打包
- 把js文件引入到html执行查看效果
3.3_插件-自动生成html文件
目标: html-webpack-plugin插件, 让webpack打包后生成html文件并自动引入打包后的js
- html-webpack-plugin插件地址
- 下载插件
yarn add html-webpack-plugin -D
- webpack.config.js配置
// 引入自动生成 html 的插件
const HtmlWebpackPlugin = require('html-webpack-plugin')module.exports = {// ...省略其他代码plugins: [// plugins插件配置new HtmlWebpackPlugin({template: './public/index.html' // 告诉webpack使用插件时, 以我们自己的html文件作为模板去生成dist/html文件})]
}
- 重新打包后观察dist下是否多出html并运行看效果
- 打包后的index.html自动引入打包后的js文件
- 访问dist目录即可:访问任何一个目录,浏览器会默认打开此目录下的index.html文件
总结: webpack就像一个人, webpack.config.js是人物属性, 给它穿什么装备它就干什么活
如何让webpack打包时自动生成html文件呢?
- 依赖html-webpack-plugin插件,yarn下载此插件
- 在webpack.config.js配置文件写入即可
断更
今日总结
- 什么是webpack, 它有什么作用
- 知道yarn的使用过程, 自定义命令, 下载删除包
- 有了webpack让模块化开发前端项目成为了可能, 底层需要node支持
- 对webpack各种配置项了解
- 入口/出口
- 插件
- 加载器
- mode模式
- devServer
- webpack开发服务器的使用和运作过程
面试题
1、什么是webpack(必会)
webpack是一个打包模块化javascript的工具,在webpack里一切文件皆模块,通过loader转换文件,通过plugin注入钩子,最后输出由多个模块组合成的文件,webpack专注构建模块化项目
2、Webpack的优点是什么?(必会)
- 专注于处理模块化的项目,能做到开箱即用,一步到位
- 通过plugin扩展,完整好用又不失灵活
- 通过loaders扩展, 可以让webpack把所有类型的文件都解析打包
- 区庞大活跃,经常引入紧跟时代发展的新特性,能为大多数场景找到已有的开源扩展
3、webpack的构建流程是什么?从读取配置到输出文件这个过程尽量说全(必会)
Webpack 的运行流程是一个串行的过程,从启动到结束会依次执行以下流程:1. 初始化参数:从配置文件读取与合并参数,得出最终的参数
- 开始编译:用上一步得到的参数初始化 Compiler 对象,加载所有配置的插件,开始执行编译
- 确定入口:根据配置中的 entry 找出所有的入口文件
- 编译模块:从入口文件出发,调用所有配置的 Loader 对模块进行翻译,再找出该模块依赖的模块,再递归本步骤直到所有入口依赖的文件都经过了本步骤的处理
- 完成模块编译:在经过第4步使用 Loader 翻译完所有模块后,得到了每个模块被翻译后的最终内容以及它们之间的依赖关系
- 输出资源:根据入口和模块之间的依赖关系,组装成一个个包含多个模块的 Chunk,再把每个 Chunk 转换成一个单独的文件加入到输出列表,这步是可以修改输出内容的最后机会
- 输出完成:在确定好输出内容后,根据配置确定输出的路径和文件名,把文件内容写入到文件系统。
在以上过程中,Webpack 会在特定的时间点广播出特定的事件,插件在监听到感兴趣的事件后会执行特定的逻辑,并且插件可以调用 Webpack 提供的 API 改变 Webpack 的运行结果
4、说一下 Webpack 的热更新原理(必会)
webpack 的热更新又称热替换(Hot Module Replacement),缩写为 HMR。这个机制可以做到不用刷新浏览器而将新变更的模块替换掉旧的模块。HMR的核心就是客户端从服务端拉去更新后的文件,准确的说是 chunk diff (chunk 需要更新的部分),实际上 WDS 与浏览器之间维护了一个 Websocket,当本地资源发生变化时,WDS 会向浏览器推送更新,并带上构建时的 hash,让客户端与上一次资源进行对比。客户端对比出差异后会向 WDS 发起 Ajax 请求来获取更改内容(文件列表、hash),这样客户端就可以再借助这些信息继续向 WDS 发起 jsonp 请求获取该chunk的增量更新。后续的部分(拿到增量更新之后如何处理?哪些状态该保留?哪些又需要更新?)由 HotModulePlugin 来完成,提供了相关 API 以供开发者针对自身场景进行处理,像react-hot-loader 和 vue-loader 都是借助这些 API 实现 HMR。
5、webpack与grunt、gulp的不同?(必会)
1) 三者之间的区别三者都是前端构建工具,grunt和gulp在早期比较流行,现在webpack相对来说比较主流,不过一些轻量化的任务还是会用gulp来处理,比如单独打包CSS文件等。grunt和gulp是基于任务和流(Task、Stream)的。类似jQuery,找到一个(或一类)文件,对其做一系列链式操作,更新流上的数据, 整条链式操作构成了一个任务,多个任务就构成了整个web的构建流程。webpack是基于入口的。webpack会自动地递归解析入口所需要加载的所有资源文件,然后用不同的Loader来处理不同的文件,用Plugin来扩展webpack功能。2) 从构建思路来说gulp和grunt需要开发者将整个前端构建过程拆分成多个Task,并合理控制所有Task的调用关系 webpack需要开发者找到入口,并需要清楚对于不同的资源应该使用什么Loader做何种解析和加工3) 对于知识背景来说gulp更像后端开发者的思路,需要对于整个流程了如指掌 webpack更倾向于前端开发者的思路
6、有哪些常见的Loader?他们是解决什么问题的?(必会)
1、 file-loader:把文件输出到一个文件夹中,在代码中通过相对 URL 去引用输出的文件
2、 url-loader:和 file-loader 类似,但是能在文件很小的情况下以 base64 的方式把文件内容注入到代码中去
3、 source-map-loader:加载额外的 Source Map 文件,以方便断点调试
4、 image-loader:加载并且压缩图片文件
5、 babel-loader:把 ES6 转换成 ES5
6、 css-loader:加载 CSS,支持模块化、压缩、文件导入等特性
7、 style-loader:把 CSS 代码注入到 JavaScript 中,通过 DOM 操作去加载 CSS。
8、 eslint-loader:通过 ESLint 检查 JavaScript 代码
7、Loader和Plugin的不同?(必会)
1) 不同的作用Loader直译为"加载器"。Webpack将一切文件视为模块,但是webpack原生是只能解析js文件,如果想将其他文件也打包的话,就会用到loader。 所以Loader的作用是让webpack拥有了加载和解析非JavaScript文件的能力。Plugin直译为"插件"。Plugin可以扩展webpack的功能,让webpack具有更多的灵活性。 在 Webpack 运行的生命周期中会广播出许多事件,Plugin 可以监听这些事件,在合适的时机通过 Webpack 提供的 API 改变输出结果。
-
不同的用法
Loader在module.rules中配置,也就是说他作为模块的解析规则而存在。 类型为数组,每一项都是一个Object,里面描述了对于什么类型的文件(test),使用什么加载(loader)和使用的参数(options)
Plugin在plugins中单独配置。 类型为数组,每一项是一个plugin的实例,参数都通过构造函数传入。
发布评论