wepack scope hoisting

本文探讨了webpack的scope hoisting现象,它会导致模块在构建后的位置改变,可能影响动态指定的publicPath。scope hoisting是通过ModuleConcatenationPlugin实现的,该插件在生产环境中默认启用,有助于减少代码体积和内存开销。在开发环境中关闭插件可以看到明显的差异。文章还引申讨论了静态模块的概念,并提供了相关参考资料。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

有一次在使用webpack构建组件项目时,需要动态指定publicpath,类似如下的代码:
在这里插入图片描述
在这里插入图片描述
构建后,在运行态下,发现模块A中,并没有应用动态指定的publicPath。查看了构建后的资源:

在这里插入图片描述

可以明显看到,模块A被提升到了 指定publicPath的前面,这就导致了A中的path并没有生效。查阅了webpack的官方文档,也验证了这一点:
在这里插入图片描述
就是说,如果你使用了ES6 Module 导入了你的入口文件,那么 __webpack_public_path__ 的声明将会在import之后。所以为了避免出现问题,可以将__webpack_public_path__的声明放在单独的文件中,然后导入到程序入口。

为了验证这个问题,尝试了下使用AMD来引入模块A:
在这里插入图片描述
构建之后:
在这里插入图片描述
可以发现,在使用AMD模块化的时候,模块A并没有被提升。
那为什么在使用ES6 module的时候,会被提升呢?

scope hoisting

这其实涉及到webpack中的一个概念,就是scope hoisting,即 作用域提升。就是说在构建过程中,webpack会借助ES6 module的静态特性,确定模块的依赖关系,将一个bundle中的静态依赖提升到顶部。
基于此,webpack就可以将零散的模块合并到一个函数中去(但前提是不能造成代码冗余。 因此只有那些被引用了一次的模块才能被合并)。这样做的好处有:

  • 代码体积减少
  • 代码在运行时因为创建的函数作用域更少了,内存开销也随之变小

wepack4中的一个插件ModuleConcatenationPlugin便是实现此功能的。webpack4 在生产环境构建中内置了该插件,其他模式下并没有开启。

为了方便对比差异,我们在开发环境下,对比开启/关闭该插件后的构建结果:

开启 ModuleConcatenationPlugin

在这里插入图片描述

关闭 ModuleConcatenationPlugin

在这里插入图片描述
webpack对scope hosting 与code spliting 的解释https://github.com/webpack/webpack/tree/master/examples/scope-hoisting

引申的思考?:

  1. 何为静态模块

参考文章:

  1. https://imweb.io/topic/5a43064fa192c3b460fce360
  2. https://webpack.js.org/plugins/module-concatenation-plugin/
  3. https://zhuanlan.zhihu.com/p/27980441
  4. https://github.com/wangning0/Autumn_Ning_Blog/issues/28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值