前端开发那些事儿

一些有关webpack的概念

2021-03-31  本文已影响0人  弱冠而不立

参考文章:「吐血整理」再来一打Webpack面试题

1. 用过哪些 loader

2. 用过哪些 plugin

3. loader 和 plugin 的区别

loader 本质上就是一个函数

webpack 只能理解 JavaScript 和 JSON 文件,这是 webpack 开箱可用的自带能力。loader 让 webpack 能够去处理其他类型的文件。
在 webpack 的配置文件中的 module.rules 配置 loader,loader 有两个属性:

  1. test 属性,识别出哪些文件会被转换。
  2. use 属性,定义出在进行转换时,应该使用哪个 loader。

例:

//webpack.config.js

const path = require('path');

module.exports = {
  output: {
    filename: '...'
  },
  module: {
    rules: [
      { test: /\.txt$/, use: 'raw-loader' }
    ]
  }
};
plugin 是插件,插件可以扩展 webpack 功能。

webpack 运行的生命周期中会触发很多事件,plugin 可以监听这些事件。在合适的时机,通过 webpack 提供的 API 改变输出结果。
在 webpack 的配置文件的 plugins 中单独配置,每一项是一个 Plugin 的实例,参数都通过构造函数传入。
例:

const HtmlWebpackPlugin = require('html-webpack-plugin'); // 通过 npm 安装
const webpack = require('webpack'); // 用于访问内置插件

module.exports = {
  module: {
    rules: [
      { test: /\.txt$/, use: 'raw-loader' }
    ]
  },
  plugins: [
    new HtmlWebpackPlugin({template: './src/index.html'})
  ]
};

3. source map是什么?

Source Map,顾名思义,是保存源代码映射关系的文件。

在项目开发完进行打包后,在打包的文件夹里通常除了js,css,图片字体等资源文件外,大家一定还见过xxx.js.map的文件。这种带map后缀的文件就是Source Map文件——它保存了源代码和转换之后代码(通常经过压缩混淆和其他转换)的关系。 最好的例子就是 jquery 的开发版和线上发布时候的 min 版本了。
这样虽然对带宽很友好,但是调试起来就不是那么轻松了。

我们都希望报错时,像第二种,能在控制台中提示我们具体的报错位置。
map文件只要不打开开发者工具,浏览器是不会加载的。
生产环境的话可以,通过 nginx 设
置 .map 文件对白名单开发。

4. 文件监听原理呢?

Webpack开启监听模式,有两种方式:

缺点:每次需要手动刷新浏览器

原理:轮询判断文件的最后编辑时间是否变化,如果某个文件发生了变化,并不会立刻告诉监听者,而是先缓存起来,等 aggregateTimeout 后再执行。

module.export = {    
    // 默认false,也就是不开启
    watch: true,
    // 只有开启监听模式时,watchOptions才有意义
    watchOptions: {
        // 默认为空,不监听的文件或者文件夹,支持正则匹配
        ignored: /node_modules/, 
        // 监听到变化发生后会等300ms再去执行,默认300ms                  
        aggregateTimeout:300,
        // 判断文件是否发生变化是通过不停询问系统指定文件有没有变化实现的,默认每秒问1000次
        poll:1000
    }
}

5. 热更新原理

Webpack 的热更新又称热替换(Hot Module Replacement),缩写为 HMR。 这个机制可以做到不用刷新浏览器而将新变更的模块替换掉旧的模块。

HMR的核心就是客户端从服务端拉去更新后的文件,准确的说是 chunk diff (chunk 需要更新的部分)
webpack-dev-server (下面简称WDS)与浏览器之间维护了一个 Websocket,当本地资源发生变化时,WDS 会向浏览器推送更新,并带上构建时的 hash,让客户端与上一次资源进行对比。客户端对比出差异后会向 WDS 发起请求来获取更改内容(文件列表、hash),这样客户端就可以再借助这些信息继续向 WDS 发起请求获取该chunk的增量更新。

6. 文件指纹是什么?怎么用?

文件指纹是打包后输出的文件名的后缀。

7. 代码分割的本质和意义

使得文件大小更合理。
两种极端情况:

8. 编写 loader 的思路

  1. Loader 运行在 Node.js 中,我们可以调用任意 Node.js 自带的 API 或者安装第三方模块进行调用
  2. Loader 支持链式调用,所以开发上需要严格遵循“单一职责”,每个 Loader 只负责自己需要负责的事情。
  3. Loader 是无状态的,我们不应该在 Loader 中保留状态。每次运行都应该独立于其他编译模块以及相同模块之前的编译结果。

9. Babel原理

Babel大概分为三大部分:

  1. 解析:将代码转换成 AST
    • 词法分析:将代码(字符串)分割为token流,即语法单元成的数组
    • 语法分析:分析token流(上面生成的数组)并生成 AST
  2. 转换:访问 AST 的节点进行变换操作生产新的 AST
  3. 生成:以新的 AST 为基础生成代码
上一篇 下一篇

猜你喜欢

热点阅读