js-webpack相关内容

114 阅读4分钟
  • 1、source map
    • 是将编译、打包、压缩后的代码映射回源代码的过程。打包压缩后的代码不具备良好的可读性,想要调试源码就需要 soucre map。\
    • map文件只要不打开开发者工具,浏览器是不会加载的。\
    • 线上环境一般有三种处理方案:
      • hidden-source-map:借助第三方错误监控平台 Sentry 使用\
      • nosources-source-map:只会显示具体行数以及查看源代码的错误栈。安全性比 sourcemap 高\
      • sourcemap:通过 nginx 设置将 .map 文件只对白名单开放(公司内网)

注意:避免在生产中使用 inline- 和 eval-,因为它们会增加 bundle 体积大小,并降低整体性能。

  • 2、webpack中的文件监听原理

  • 3、对bundle体积进行监控和分析
    • VSCode 中有一个插件 Import Cost 可以帮助我们对引入模块的大小进行实时监测,还可以使用 webpack-bundle-analyzer 生成 bundle 的模块组成图,显示所占体积。\
    • bundlesize 工具包可以进行自动化资源体积监控。

  • 4、条件指纹
    • 文件指纹是文件打包输出之后的文件名后缀,用于标识文件是否经过修改,通常用于文件的版本管理\
    • [hash] - 和整个项目的构建有关,只要项目中的文件有修改,整个项目中文件的 hash 都会修改\
    • [chunkhash] - 和 webpack 打包的 chunk 有关,不同的 entry 生成不同的 chunkhash (js 文件一般采用此方法)\
    • [contenthash] - 根据文件内容定义 hash 值,文件内容不变,则 contenthash 值不变 (css文件一般采用此方法)

  • 5、配置文件上百行,如何保证各个loader按照预想方式工作?
    • 可以使用 enforce 强制执行 loader 的作用顺序,pre 代表在所有正常 loader 之前执行,post 是所有 loader 之后执行。(inline 官方不推荐使用)

  • 6、chunk
    • 在 webpack 中,从入口文件开始可能会依赖其他模块,其他模块又可能依赖模块,webpack 通过引用关系将这些模块打包成一个 js 文件,这个文件就是一个 chunk;如果在 webpack 中配置了多个入口文件,那么就可能有多条引用路径,就会产生不同的 chunk
    • 代码分割的本质其实就是在源代码直接上线和打包成唯一脚本main.bundle.js这两种极端方案之间的一种更适合实际场景的中间状态。\阿卡丽:荣耀剑下取,均衡乱中求\「用可接受的服务器性能压力增加来换取更好的用户体验。」\源代码直接上线:虽然过程可控,但是http请求多,性能开销大。\打包成唯一脚本:一把梭完自己爽,服务器压力小,但是页面空白期长,用户体验不好。(Easy peezy right)

  • 7、babel和ast
    • AST(抽象语法树)是源代码编译过程的中间产物,是源代码的抽象语法结构的树状表示,抽象表示把 js 代码进行了结构化的转化,转化为一种以 json 对象表示的数据结构;AST 的用途十分广泛,不仅仅用在 js 引擎的编译上,babel插件、eslint、Vue-cli等工具都是基于 AST 原理实现
    • 大多数JavaScript Parser遵循 estree 规范,Babel 最初基于 acorn 项目(轻量级现代 JavaScript 解析器)\
    • Babel大概分为三大部分:
      • 解析:将代码转换成 AST;词法分析:将代码(字符串)分割为token流,即语法单元成的数组语法分析:分析token流(上面生成的数组)并生成 AST\
      • 转换:访问 AST 的节点进行变换操作生产新的 AST;Taro就是利用 babel 完成的小程序语法转换\
      • 生成:以新的 AST 为基础生成代码

  • 8、Treesharking的原理,以及webpack中的Treesharking
    • Tree Shaking 是一种基于 ES Module 规范的 Dead Code Elimination 技术\它会在运行过程中静态分析模块之间的导入导出,确定 ESM 模块中哪些导出值未曾其它模块使用,并将其删除,以此实现打包产物的优化。\
    • 在webpack中,大致经历三个阶段\
      • Make 阶段,收集模块导出变量并记录到模块依赖关系图 ModuleGraph 变量中\
      • Seal 阶段,遍历 ModuleGraph 标记模块导出变量有没有被使用\
      • 生成产物时,若变量没有被其它模块使用则删除对应的导出语句