10.webpack 和 babel
2020-04-16 11:14:56 8 举报
AI智能生成
webpack babel 配置 面试题
作者其他创作
大纲/内容
第10章 webpack 和 babel
10-1 webpack考点梳理
webpack
1. webpack已是前端打包构建的不二选择<br>2. 每日必用,面试必考<br>3. 成熟的工具,重点在于配置和使用,原理并不高优
讲解范围
1. 基本配置<br>2. 高级配置<br>3. 优化打包效率<br>4. 优化产出代码<br>5. 构建流程概述<br>6. babel
10-2 webpack基本配置串讲(上)<br>10-3 webpack基本配置串讲(下)<br>
面试状况
1. vue-cli create-react-app<br>2. 常用上述脚手架,但是自己不会配置webpack<br>3. 面试不会通过
基本配置
1. 拆分配置和merge<br>2. 启动本地服务<br>3. 处理ES6(babel-loader)<br>4. 处理样式<br>(postcss-loader,是处理css浏览器兼容性的、<br> less-loader、<br> css-loader<br> style-loader)<br>5. 处理图片(file-loader)<br>6. (模块化)
拆分配置和merge
拆分
merge
启动本地服务<br>devServer
proxy,设置代理,可以跨域请求其他接口
处理ES6
test<br>include<br>exclude<br>作用都要知道
需要配置.bebelrc
处理样式
postcss-loader,是处理css浏览器兼容性的<br>less-loader<br>css-loader<br>style-loader<br>
使用postcss-loader时,需要配置postcss.config.js
transform: rotate(-45deg<br>可以给这些样式加一些前缀
处理图片
开发环境中
生产环境中
output<br>contentHash
10-4 webpack如何配置多入口<br>10-5 webpack如何抽离压缩css文件<br>10-6 webpack如何抽离公共代码和第三方代码<br>10-7 webpack如何实现异步加载JS<br>
面试情况
1. 基本配置只能做demo,不能做线上项目<br>2. 面试考察基本配置,只是为了快速判断你是否用过webpack<br>3. 以下高级配置,也是通过面试的必要条件
webpack高级配置
1. 多入口配置<br>2. 抽离css文件(考察重点)<br>3. 抽离公共代码和第三方代码(考察重点)<br>4. 懒加载(考察重点)<br>5. 处理JS(@babel/preset-react)<br>6. 处理vue(vue-loader)<br>
多入口配置
1. entry<br>2. output<br>3. 针对每个入口都要生成一个.html文件
chunks 表示该页面要引用哪些 chunk (即上面的 index 和 other),默认全部引用<br> chunks: ['index', 'vendor', 'common'] // 要考虑代码分割
抽离CSS文件
抽离css文件后,css样式是以外部链接文件的形式引入的
不抽离css时,css会放到<style>中
线上打包,必须抽离CSS文件
抽离公共代码<br>和第三方代码
两个文件引入了同一个模块,会打包两次
第三方模块
lodash文件较大<br>每次修改业务代码时,lodash都要重新打包,但是lodash并没有改变根本不需要重新打包<br>应该把lodash拆出去单独打包,当业务代码改变时,loadsh会命中缓存,加载会快
chunks & 缓存分租
可以设置minSize来限制多大的第三方模块单独打包<br>如果文件非常小,可以不抽离,直接和业务代码一起打包
minChunks: 2 // 公共模块最少复用过几次<br>比如公共模块至少复用了2次,就把它抽离出来单独打包,比如math
懒加载
懒加载也会产生一个chunk
处理JSX
@babel/preset-react
处理vue
vue-loader
10-8 module chunk bundle 的区别
module chunk bundle的区别
1. module-各个源码文件,webpack中一切皆模块<br>(能被引入的文件都是模块,不管是什么类型,比如css js 图片)<br>2. chunk-多模块合并成的,如entry、import() 、splitChunk都可以生成chunk<br>3. bundle-最终的输出文件
10-9 webpack优化构建速度-知识点串讲 <br>10-10 用IngorePlugin忽略无用文件<br>10-11 happyPack是什么<br>10-12 webpack如何配置热更新<br>10-13 何时使用DllPlugin<br>10-14 webpack优化构建速度-考点总结和复习<br>
注意
面试时,不要让面试官觉得你在背面试题
webpack性能优化
1. 大厂必考 & 社区热议话题<br>2. 优化打包构建速度-开发体验和效率<br>3. 优化产出代码-产品性能
优化构建速度
1. 优化babel-loader<br>2. IgnorePlugin<br>3. noParse<br>4. happyPack<br>5. ParallelUglify<br>6. 自动刷新<br>7. 热更新<br>8. DllPlugin
优化babel-loader
开启缓存: 用cacheDirectory,只要ES6代码没变,就不会重新编译,会缓存下来<br>第二次编译时,没改的部分使用缓存<br>
明确范围
include<br>exclude
happyPack多进程打包
1. JS单线程,开启多进程打包<br>2. 提高构建速度(特别是多核CPU)
ParallelUglify多进程压缩JS
1. webpack内置Uglify工具压缩JS<br>2. JS 单线程,开启多进程压缩更快<br>3. 和happyPack同理
在开发环境下使用压缩
关于开启多进程
1. 项目较大,打包较慢,开启多进程能提高速度<br>2. 项目较小,打包很快,开启多进程会降低速度(进程开销)<br>3. 按需使用<br><br>要理解不要背书,什么情况下使用什么情况下不适用
自动刷新
开发环境下使用,生产环境没有自动刷新<br><br>在开发环境下配置devServer时,就默认开启自动刷新
热更新<br>HotModuleReplacementPlugin<br>
1. 自动刷新:整个网页全部刷新,速度较慢<br>2. 自动刷新:整个网页全部刷新,状态会丢失<br>(比如填写表单时,网页刷新会导致表单内容丢失。<br> 或者路由跳转了很多次,网页刷新后会跳转到首页)<br>3. 热更新:新代码生效,网页不刷新,状态不丢失
热更新配置
自己配置哪些模块需要热更新
网页刷新对开发体验影响很大时,开启热更新<br>否则就用网页刷新
DllPlugin动态链接库插件<br>
1. 前端框架如vue React,体积大,构建慢<br>2. 较稳定,不常升级版本<br>3. 同一个版本只构建一次即可,不用每次都重新构建
1. webpack已内置DllPlugin支持<br>2. DllPlugin-打包出dll文件<br>3. DllReferencePlugin-使用dll文件
DllPlugin-打包出dll文件
react.dll.js 是打包后的内容<br>react.manifest.json是索引<br>
DllReferencePlugin-使用dll文件
思路就是,先提前打包一次,再引用之前打包的文件
适用环境
webpack优化构建速度<br>(可用于生产环境)
1. 优化babel-loader<br> 缓存用于开发环境,生产环境基本不用<br> 用 include exclude明确范围<br>2. IgnorePlugin<br> 避免一些模块引入<br> 不用的话,可能造成一些问题,比较打包后的体积大、打包慢<br>3. noParse<br> 避免打包一些东西,提高生产环境打包的速度<br>4. happyPack<br>5. ParallelUglifyPlugin(必须用于生产环境,压缩代码)
webpack优化构建速度<br>(不可用于生产环境!)
1. 自动刷新<br>2. 热更新<br>3. DllPlugin
10-15 webpack优化产出代码-考点串讲<br>10-16 什么是Tree-Shaking<br>10-18 什么是Scope Hosting<br>
webpack性能优化-产出代码<br>
1. 体积更小<br>2. 合理分包,不重复加载<br>3. 速度更快,内存使用更少
1. 小图片base64编码<br>2. bundle 加 hash<br>3. 懒加载<br> import<br> 对大文件使用<br>4. 提取公共代码<br>5. IgnorePluging<br>6. 使用CDN加速<br>7. 使用production<br> 自动压缩、<br> 删掉调试代码<br> 自动开启tree-Shaking<br>8. Scope Hosting
小图片base64编码
小图片base64编码
bundle 加 hash
bundle 加 hash
提取公共代码
提取公共代码
使用cdn加速
修改所有静态url的前缀(CDN前缀)
引用cdn地址
把打包的文件上传到CDN服务器上去
可以用于js css 图片
production
用mode: 'production',打包生产环境代码
1. 自动开启代码压缩<br>2. Vue React等会自动删掉调试代码(如开发环境的warning)<br>3. 自动启动Tree-Shaking
什么是Tree-Shaking
js和css都可以treeShaking
ES6 Module才能让tree-shaking生效<br> commonjs不可以<br>因为ES6 Module是静态引入,Commonjs是动态引入
Scope Hosting
打包结果
两个文件,对应两个函数,一个函数产生一个作用域
文件越多,产生的函数越多,每个函数都有一个作用域,对js代码执行和内存消耗非常不友好
开启Scope Hosting
代码体积越大,Scope Hosting效果越好
作用
1. 代码体积更小<br>2. 创建函数作用域更少<br>3. 代码可读性更好
怎么使用
多个函数合并成一个函数,作用域会减少
10-17 ES Module 和 Commonjs 的区别
区别
1. ES6Module是静态引入,编译时引入<br> 直接引入,打包时能直接识别到,不能在条件中判断是否引用<br>2. Common动态引入,执行时引入<br>3. 只有ES6 Module才能静态分析,实现Tree-Shaking
10-19 babel基本概念串讲<br>10-20 babel-polyfill是什么<br>10-21 babel-polyfill如何按需引入<br>10-22 babel-runtime是什么<br>
babel
面试要求
1. 前端开发环境必备工具<br>2. 同webpack,需要了解基本的配置和使用<br>3. 面试考察概率不高,但要求必会
环境搭建和基本配置
1. 环境搭建<br>2. .babelrc配置<br>3. presets和plugins
presets
选项
@babel/preset-env(转换es6 es7 es8语法)<br>@babel/preset-flow<br>@babel/preset-react (转换jsx语法)<br>@babel/preset-typescript (转换ts语法)
@babel/preset-env
@babel/preset-env<br>是一个babel插件的集合<br>是一个预设置,代替我们写很多的plugins
npx babel src/index.js<br>用babel把ES6语法编译成ES5语法
const sum = (a, b) => a + b<br>的编译结果
babel和babel-loader的区别
babel 是编译 es6 的核心工具。<br>babel-loader 是借用了 babel ,封装了一下,将 babel 用于 webpack 的打包流程。<br>这一点,很类似于 less 和 less-loader 。
babel-polyfill
babel-polyfill是什么?
1. 什么是Polyfill<br>(对一些浏览器不支持的函数做补丁或者兼容)<br>2. core-js和regenerator<br> core-js:<br> 集成了一些新语法的补丁<br> https://github.com/zloirock/core-js<br> 提供了es5、es6的polyfills,包括promises、symbols、collections、iterators、typed arrays、ECMAScript 7+ proposals、setImmediate 等等。<br> 但是它不支持generator<br> regenerator:支持generator<br>3. babel-polyfill即两者的集合
babel-polyfill现已被弃用<br>1. Babel7.4之后,弃用babel-polyfill|<br>2. 推荐直接使用core-js和regenerator<br>3. 但并不影响面试会考察它
不用babel-polyfill时
代码演示
配置
代码
转化结果,转了箭头函数,不处理API
使用babel-polyfill时
代码演示
代码
转化结果
babel-polyfill功能
babel只负责解析语法,不处理API<br>也不管模块化(webpack处理模块化)<br><br>babel处理完交给webpack<br>webpack把babel-polyfill引入进来<br>polyfill解析Promise和includes,API就可以在浏览器正常运行 <br>
babel-polyfill如何按需引入
为什么按需引入
1. babel-polyfill文件较大<br>2. 只使用其中一部分功能,无需全部引入<br>
代码演示
配置<br>这个配置,满足babel7.4版本后babel-polly被弃用的配置
不需要import(@babel/polyfill)
按需引入的效果<br>不会require("@babel/polyfill)"<br>只引入需要的core-js的语法特性
babel-polyfill的问题
1. 会污染全局环境<br>2. 如果做一个独立的web系统,则无碍<br>3. 如果做一个第三方lib, 则会有问题
如果定义window.Promise和Array.prototype.includes,可能会和使用方冲突<br>(比如使用方就想把window.Promise赋值‘abc’)<br>可以给它重新命名来解决, 不要污染全局环境
配置
效果
_promise _includes 不会污染全局环境<br>使用方使用时没有副作用
10-23 webpack考点总结和复习
1. 基本配置<br>2. 高级配置<br>3. 优化打包效率<br>4. 优化产出代码<br>5. 构建流程概述<br>6. babel
基本配置
1. 拆分配置和merge <br>2. 启动本地服务 proxy代理<br>3. 处理ES6<br>4. 处理样式<br>5. 处理图片
高级配置
1. 多入口<br>2. 抽离CSS文件<br>3. 抽离公共代码和第三方库<br>4. 懒加载<br>5. 处理JSX<br>6. 处理vue
优化构建速度
可用于生产环境
1. 优化babel-loader<br>2. IgnorePlugin<br>3. noParse<br>4. happyPack<br>5. ParallelUglifyPlugin
不可用于生产环境
1. 自动刷新<br>2. 热更新<br>3. DllPlugin
优化产出代码
1. 小图片base64编码<br>2. bundle 加 hash<br>3. 懒加载<br> import<br> 对大文件使用<br>4. 提取公共代码<br>5. IgnorePluging<br>6. 使用CDN加速<br>7. 使用production<br> 自动压缩、<br> 删掉调试代码<br> 自动开启tree-Shaking<br>8. Scope Hosting
babel
1. 环境搭建&基本配置<br>2. babel-polyfill<br>3. babel-runtime
10-24 webpack面试真题-前端代码为何要打包<br>10-25 webpack面试真题-为何Proxy不能被Polyfill <br>10-26 webpack面试真题-常见性能优化方法<br>
wbpack面试题
前端代码为何要打包
代码层面
1. 体积更小(Tree-Shaking、压缩、合并),加载更快<br>2. 编译高级语言或语法(TS,ES6+, 模块化,scss)<br>3. 兼容性和错误提示(pollyfill、postcss、eslint)
打包流程、前端工程化方面
1. 统一、高效的开发环境<br>2. 统一的构建流程和产出标准<br>3. 集成公司构建规范(提测、上线等)
module chunk bundle的区别
1. module-各个源码文件,webpack中一切皆模块<br>2. chunk-多模块合成,如entry import() splitChunk<br>3. bundle-最终产出的文件
loader和plugin的区别
1. loader模块转换器,如less->css<br>2. plugin扩展插件,如HtmlWebpackPlugin
常见loader和plugin有哪些
babel和webpack的区别
1. babel-JS 新语法编译工具,不关心模块化<br>2. webpack-打包构建工具,是多个loader plugin的集合<br>
如何产出一个lib
1. 参考wbpack.dll.js<br>2. output.library
babel-polyfill和babel-runtime的区别
1. babel-polyfill会污染全局<br>2. babel-runtime不会污染全局<br>3, 产出第三方lib要用babel-runtime
webpack如何使用懒加载
1. import()<br>2. 结合Vue React异步组件<br>3. 结合Vue-router React-router异步加载路由
为何Proxy不能被Polyfill ?
1. 如Class可以用function模拟<br>2. 如Promise可以用callback来模拟<br>3. 但Proxy的功能用Object.defineProperty无法模拟
优化构建速度
可用于生产环境
1. 优化babel-loader<br>2. IgnorePlugin<br>3.noParse<br>4. happyPack<br>5. ParellelUglifyPlugin
不能用于生产环境!
1. 自动刷新<br>2. 热更新<br>3. DllPlugin
优化产出代码
1. 小图片base64编码<br>2. bundle 加hash<br>3. 懒加载<br>4. 提取公共代码<br>5. 使用CDN加速<br>6.ignorePlugin<br>7. 使用production<br>8. Scope Hosting
0 条评论
下一页
为你推荐
查看更多