面试知识点梳理
2020-06-05 14:16:30 0 举报
AI智能生成
前端面试内容梳理
作者其他创作
大纲/内容
CSS
清除浮动
1、添加新元素
2、使用伪元素
3、触发父元素BFC
盒模型
flex
容器属性
flex-direction<br>flex-wrap<br>flex-flow<br>justify-content<br>align-items<br>align-content
项目属性
order<br>flex-grow<br>flex-shrink<br>flex-basis<br>flex<br>align-self
BFC
一列定宽一列自适应
JS
作用域作用域链
this
闭包
变量提升
Promise
EventLoop
浏览器
vue全家桶
webpack
几个常见的loader
<ul><li><font color="#c41230">babel-loader</font>:把 ES6 转换成 ES5</li></ul>
图片/字体文件处理
<ul><li><font color="#c41230">file-loader</font></li></ul>
<ul><li><font color="#c41230">url-loader</font></li></ul>
<ul><li><font color="#c41230">source-map-loader</font></li></ul>
<font color="#c41230">处理样式文件</font>
<ul><li><font color="#c41230">style-loader</font></li></ul>
<ul><li><font color="#c41230">css-loader</font></li></ul>
<ul><li><font color="#c41230">postcss-loader</font></li></ul>
<ul><li><font color="#c41230">sass-loader</font></li></ul>
<ul><li><font color="#c41230">less-loader</font></li></ul>
几个常见的plugin
<ul><li><font color="#c41230">html-webpack-plugin</font></li></ul>
<ul><li>DllPlugin</li></ul>
<ul><li>DLLReferencePlugin</li></ul>
<ul><li><font color="#c41230">SplitChunksPlugin</font></li></ul>
<ul><li><font color="#c41230">HotModuleReplacementPlugin</font></li></ul>
<ul><li><font color="#c41230">DefinePlugin</font></li></ul>
<ul><li><font color="#c41230">clean-webpack-plugin</font></li></ul>
处理CSS
<ul><li><font color="#c41230"> mini-css-extract-plugin</font></li></ul>
<ul><li><font color="#c41230">optimize-css-assets-webpack-plugin</font></li></ul>
进阶
<b><font color="#ffffff">按需加载</font></b>
<font color="#c41230">import()</font>
import() 语法,需要 @babel/plugin-syntax-dynamic-import 的插件支持,<br>但是因为当前 <font color="#c41230">@babel/preset-env </font>预设中已经包含了 @babel/plugin-syntax-dynamic-import,因此我们<font color="#c41230">不需要再单独安装和配置</font>。<br>
webpack 遇到 import(****) 这样的语法的时候,会这样处理:<br>
<ul><li>以**** 为入口新生成一个 Chunk</li><li>当代码执行到 import 所在的语句时,才会加载该 Chunk 所对应的文件(如这里的1.bundle.8bf4dc.js)</li></ul>
<font color="#ffffff">热更新</font>
<ol><li>首先配置 devServer 的 hot 为 true</li></ol>
2. 并且在 plugins 中增加<br> new webpack.HotModuleReplacementPlugin()
3. 在入口文件中新增
此时,再修改代码,不会造成整个页面的刷新
多页应用打包
配置
配置chunks 参数,指定html引入的js文件
查看 index.html 和 login.html 会发现,都同时引入了 index.f7d21a.js 和 login.f7d21a.js,通常这不是我们想要的,<br>我们希望,index.html 中只引入 index.f7d21a.js,login.html 只引入 login.f7d21a.js<br><br>HtmlWebpackPlugin 提供了一个 <font color="#c41230">chunks 的参数</font>,可以接受一个数组,配置此参数仅<font color="#c41230">会将数组中指定的js引入到html文件中</font>,<br>此外,如果你需要引入多个JS文件,仅有少数不想引入,还可以指定<font color="#c41230"> excludeChunks </font>参数,它接受一个数组<br>
resolve 配置
resolve 配置 webpack <font color="#c41230">如何寻找模块所对应的文件</font>。<br>webpack 内置 JavaScript 模块化语法解析功能,默认会采用模块化标准里约定好的规则去寻找,<br>但你可以根据自己的需要修改默认的规则。
配置项
modules
resolve.modules 配置 webpack <font color="#c41230">去哪些目录下寻找第三方模块</font>,<font color="#c41230">默认</font>情况下,只会去<font color="#c41230"> node_modules 下寻找</font>,<br>如果你我们项目中某个文件夹下的模块经常被导入,不希望写很长的路径,那么就可以通过配置 resolve.modules 来简化<br>
alias
resolve.alias 配置项通过别名把原导入路径映射成一个新的导入路径
extensions
用途
适配多端的项目
缺省文件后缀
在导入语句没带文件后缀时,会自动带上extensions 中配置的后缀后,去尝试访问文件是否存在,<br>因此要将<font color="#c41230">高频的后缀放在前面</font>,并且数组不要太长,<font color="#c41230">减少尝试次数</font>。<br>如果没有配置 extensions,默认只会找对对应的js文件
enforceExtension
如果配置了 resolve.enforceExtension 为 true,那么导入语句不能缺省文件后缀。
mainFields
有一些第三方模块会提供多份代码,<br>引入模块时,去找哪个文件以及查找的顺序
区分不同的环境
<font color="#c41230">webpack-merge</font> 专为 webpack 设计,提供了一个 merge 函数,用于连接数组,合并对象
定义环境变量
使用 webpack 内置插件<font color="#c41230"> DefinePlugin</font> 来定义环境变量
配置
使用
利用webpack解决跨域问题
配置代理
优化
1. <font color="#c41230">exclude/include</font>
确保<font color="#c41230">转译尽可能少的文件</font>。<br>顾名思义,exclude 指定要排除的文件,include 指定要包含的文件
2. <font color="#c41230">cache-loader</font>
在一些性能开销较大的 loader 之前添加 cache-loader,将结果缓存中磁盘中
只打算给 babel-loader 配置 cache 的话,<br>也可以不使用 cache-loader,<br><font color="#c41230">给 babel-loader 增加选项 cacheDirectory</font>
cacheDirectory:默认值为 false。<br>当有设置时,指定的目录将用来缓存 loader 的执行结果。<br><font color="#c41230">之后的 Webpack 构建,将会尝试读取缓存,来避免在每次执行时,可能产生的、高性能消耗的 Babel 重新编译过程</font>。<br>设置空值或者 true 的话,使用默认缓存目录:node_modules/.cache/babel-loader<br>
3. happypack
把任务分解给多个子进程去并发的执行,子进程处理完后再把结果发送给主进程
当你的项目不是很复杂时,不需要配置 happypack,<br>因为进程的分配和管理也需要时间,并不能有效提升构建速度,甚至会变慢
4.thread-loader
除了使用 Happypack 外,我们也可以使用 thread-loader ,<br>把 thread-loader 放置在其它 loader 之前
thread-loader 和 Happypack 我对比了一下,构建时间基本没什么差别。<br>不过 thread-loader 配置起来为简单
5<font color="#c41230">.开启 JS 多进程压缩</font>
虽然很多 webpack 优化的文章上会提及多进程压缩的优化,<br>不管是 webpack-parallel-uglify-plugin 或者是 uglifyjs-webpack-plugin 配置 parallel。<br>不过这里我要说一句,<font color="#c41230">没必要单独安装这些插件,它们并不会让你的 Webpack 构建速度提升</font><br>
当前 Webpack 默认使用的是 <font color="#c41230">TerserWebpackPlugin</font>,<font color="#c41230">默认就开启了多进程和缓存</font>
6. <font color="#c41230">HardSourceWebpackPlugin</font>
<font color="#c41230">HardSourceWebpackPlugin 为模块提供中间缓存</font>,<br>缓存默认的存放路径是: node_modules/.cache/hard-source
首次构建时间变化不大,第二次开始,构建时间降低效果很明显
7. noParse
如果一些第三方模块没有AMD/CommonJS规范版本,可以使用 noParse 来标识这个模块,<br>这样 Webpack 会引入这些模块,但是不进行转化和解析,<br>从而提升 Webpack 的构建性能 ,例如:jquery 、lodash
如果你<font color="#c41230">使用到了不需要解析的第三方依赖</font>,<br>那么配置 noParse 很显然是一定<font color="#c41230">会起到优化作用</font>的
8. resolve
resolve 配置 webpack 如何寻找模块所对应的文件
resolve.moudles
resolve.extensions 配置,默认是 ['.js', '.json']
将频率最高的后缀放在第一位,<br>并且控制列表的长度,以减少尝试次数
项目较小时,优化效果不明显
9. IgnorePlugin
webpack 的内置插件,作用是忽略第三方包指定目录
减小包体积
10. <font color="#c41230">externals</font>
可以将一些JS<font color="#c41230">文件存储在 CDN 上</font>(减少 Webpack打包出来的 js 体积),<br>在 index.html 中通过 <script> 标签引入
希望在使用时,仍然可以通过 import 的方式去引用(如 import $ from 'jquery'),<br>并且希望 webpack <font color="#c41230">不会对其进行打包</font>,此时就可以配置 externals
11. <font color="#c41230">DllPlugin</font>
有些时候,如果<font color="#c41230">所有的JS文件都打成一个JS文件,会导致最终生成的JS文件很大</font>,<br>这个时候,我们就要考虑<font color="#c41230">拆分 bundles</font>
DllPlugin 和 DLLReferencePlugin 可以<font color="#c41230">实现拆分 bundles</font>,<br>并且可以<font color="#c41230">大大提升构建速度</font>,<br>DllPlugin 和 DLLReferencePlugin 都是 webpack 的内置模块
使用 DllPlugin 将不会频繁更新的库进行编译,<br><font color="#c41230">当这些依赖的版本没有变化时,就不需要重新编译</font>
配置
在一个新建的配置文件中,<br>把第三方库单独打包成一个动态链接库
在主配置文件中
在html文件中引入dll文件
<script src="/dll/react.dll.9dcd9d.js"></script>
效果
构建速度
构建时间缩短,<br>尤其是modules with no loaders,这项构建时间缩短较为明显
体积
打包后的bundle.js体积减少
12. <font color="#c41230">optimization.splitChunks</font><br><font color="#c41230"> 抽离公共代码</font>
抽离公共代码是<font color="#c41230">对于多页应用来说的</font>,<br>如果多个页面引入了一些公共模块,那么可以<font color="#c41230">把</font>这些<font color="#c41230">公共的模块抽离出来,单独打包</font>。<br><font color="#c41230">公共代码</font>只需要<font color="#c41230">下载一次就缓存</font>起来了,<font color="#c41230">避免了重复下载</font>
抽离公共代码对于单页应用和多页应该在配置上没有什么区别,<br>都是<font color="#c41230">配置在 optimization.splitChunks 中</font>
即使是<font color="#c41230">单页应用</font>,<font color="#c41230">同样可以使用这个配置</font>,<br>例如,打包出来的 bundle.js 体积过大,<br>我们可以将一些依赖打包成动态链接库,然后将剩下的第三方依赖拆出来。<br>这样可以有效减小 bundle.js 的体积大小<br>当然,你还可以继续提取业务代码的公共模块<br>
效果
配置DllPlugin 和 SplitChunks 后,General output time有所减少(不包含dll打包时间)
runtimeChunk
runtimeChunk 的作用是将包含 chunk 映射关系的列表从 main.js 中抽离出来,<br>在配置了 splitChunk 时,记得配置 runtimeChunk.
optimization: {<br> runtimeChunk: {<br> name: 'manifest'<br> }<br> }
终构建出来的文件中会生成一个 manifest.js
借助 <font color="#c41230">webpack-bundle-analyzer</font> 进一步优化
在做 webpack 构建优化的时候,vendor 打出来超过了1M,react 和 react-dom 已经打包成了DLL。<br>因此需要借助 webpack-bundle-analyzer 查看一下是哪些包的体积较大
配置
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;<br>。。。<br>plugins: [<br> //...<br> new BundleAnalyzerPlugin(),<br> ]<br>
使用 splitChunks 进行拆分
13.webpack自身的优化
<font color="#c41230">tree-shaking</font>
如果使用ES6的import 语法,<br>那么在<font color="#c41230">生产环境</font>下,会<font color="#c41230">自动移除没有使用到的代码</font>
<font color="#c41230">scope hosting 作用域提升</font>
变量提升,可以<font color="#c41230">减少一些变量声明</font>。<br>在<font color="#c41230">生产环境</font>下,<font color="#c41230">默认开启</font>
babel 配置的优化
开启gzip
webpack编译优化
cache-loader<br>DllPlugin<br>threadLoader
性能优化
框架
0 条评论
下一页