webpack之scope hoisting

本文介绍了webpack的scope hoisting技术,分析了不使用该技术时导致的函数调用栈过深的问题,以及启用scope hoisting后如何优化代码执行效率。同时,探讨了如何防止和设置root作用域,并通过require和import()函数示例进行说明。
摘要由CSDN通过智能技术生成

  • scope hoisting:作用域提升

不使用 scope hoisting 情况

  • 代码
// webpack.config.js
module.exports = {
  mode: 'none',
}
// index.js
import { count } from './b.js'
console.log(count);
// b.js
import all from './a.js'
export let count = 5;
console.log(all)
console.log('b.js')
// a.js
export default 'aa'
console.log('a.js')
  • 输出的bundle中模块部分
    在这里插入图片描述

  • 函数调用栈
    -> webpack_require(0)
    -> webpack_modules[0]()
    -> webpack_modules[1]()
    -> webpack_modules[2]()

  • 导致问题

    • 函数大量嵌套,函数调用栈太多降低性能

使用 scope hoisting

  • 配置及代码
// webpack.config.js
const webpack = require('webpack')
module.exports = {
  mode: 'none',
  optimization: {
    concatenateModules: true
  }

  // plugins: [
  //   new webpack.optimize.ModuleConcatenationPlugin()
  // ]
}
// 其他代码不变
  • 输入
 var __webpack_modules__ = ([/* 0 */
    /***/
    ((__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{

        // ESM COMPAT FLAG
        __webpack_require__.r(__webpack_exports__);

        ;// CONCATENATED MODULE: ./src/a.js
        // a.js
        /* harmony default export */
        const a = ('aa');
        console.log('a.js');
        // CONCATENATED MODULE: ./src/b.js
        // b.js

        let count = 5;
        console.log(a)
        console.log('b.js');
        // CONCATENATED MODULE: ./src/index.js
        // index.js

        console.log(count);

        /***/
    }
    )/*
  • 结论:函数嵌套没了,在同一个函数中执行
  • 生产环境默认开启改功能
    在这里插入图片描述

Prevent and Root

  • Prevent : 同一个作用域内(如上例)
  • Root:新模块作用域(例如 require,import() 等)
require 示例
// b.js
// import all from './a.js'
const all = require('./a')
export let count = 5;
console.log(all)
console.log('b.js')
  • 新函数
    在这里插入图片描述
import() 函数示例
// b.js
// import all from './a.js'
// const all = require('./a')
const all = import('./a')
export let count = 5;
all.then(v => console.log(v.default))
console.log('b.js')
  • 新 chunk
    在这里插入图片描述

测试代码

https://github.com/baixc1/csdn/tree/master/note/note17

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你好!对于Webpack 5的教程,我可以为您提供一些基本信息和指导。Webpack是一个模块打包工具,它可以将各种资源(例如JavaScript、CSS、图片等)打包成一个或多个文件,以优化网页加载速度。 以下是Webpack 5的一些重要特性和教程资源: 1. 模块联邦(Module Federation):Webpack 5引入了模块联邦的功能,允许多个独立的Webpack构建之间共享模块。这使得在大型项目中更容易实现微服务架构。您可以查阅Webpack官方文档中关于模块联邦的介绍和示例。 2. 改进的性能:Webpack 5在构建速度和输出文件大小方面进行了一些优化。它引入了持久缓存(persistent caching)功能,提高了构建速度。另外,Webpack 5还通过使用更先进的算法(如Tree Shaking、Scope Hoisting等)来减小输出文件的大小。 3. 新的插件系统:Webpack 5引入了一种新的插件系统,使得编写和使用插件更加简单和灵活。您可以查阅Webpack官方文档中关于插件系统的说明和示例。 对于Webpack 5的更详细教程和示例代码,您可以参考以下资源: - Webpack官方文档:Webpack官方文档提供了全面的关于Webpack 5的指南和示例。您可以访问官方文档并查找与您需求相关的章节和示例代码。 - CSDN:在CSDN上有很多Webpack 5的教程和示例代码,您可以通过搜索“webpack5教程”来查找相关资源。 - GitHub:许多开发者在GitHub上分享了关于Webpack 5的教程和示例项目。您可以在GitHub上搜索“webpack5 tutorial”来查找相关资源。 希望这些信息能够帮助到您!如果您有任何其他问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值