前端首屏优化方案之一

项目构建时会整体打包成一个bundle的JS文件,而有的代码、模块是加载时不需要的,需要分割出来单独形成一个文件块chunk(不会打包在main里),让模块懒加载(想加载时才加载),以减少应用体积、减少加载时的体积。

  1. import是关键字而非函数(类比typeoftypeof '123’ or typeof('123')
  2. 静态导入: import xxx from '',导入并加载时,导入的模块会被编译,不是按需编译
  3. 动态导入:import('') 根据条件或按需的模块导入
  4. 动态导入应用场景:
  • 模块太大,使用可能性低
  • 模块的导入占用了大量系统内存
  • 模块需要异步获取
  • 导入模块时需要动态构建路径(路径拼接)import('./' + a + '.js')
  • 模块中的代码需要程序触发了某些条件才运行(比如点击事件)
  1. 不能滥用动态导入:静态导入有利于初始化依赖,动态导入不能用于静态的程序分析和tree shaking
// module.js
export default class MyTest {construct() {console.log('构造器')}
}
<template><div><button class="test" @click="clickBtn">查看</button></div>
</template><script>
export default {name: "Plan",methods: {async clickBtn() {const res = await import("../libs/module.js");// import返回值是Promiseconsole.log("res", res);let myTest = res.default;new myTest();},},
};
</script>

// module.js
export const plus = (a, b) => {return a + b
}
<script>
export default {name: "Plan",methods: {async clickBtn() {import("../libs/module.js").then((res) => {const { plus } = res;console.log("plus 1 + 2 =", plus(1, 2)); // 3});},},
};
</script>
  • 如果使用vite/脚手架(create react app)搭建的项目 → 可以直接使用import()
  • 如果是手动做webpack的配置,查看代码分割指南
    webpack动态导入
  • 如果是用babel解析import() 需要安装依赖@babel/plugin-syntax-dynamic-import(在动态注册vue-router时,出现对import的语法错误,可能就是需要安装该依赖)

react中使用

  • 对于动态import的内容,不会直接打包进main.js里;如果是静态导入的就会直接打包进一个js里
function Button() {// 函数里定义方法,要写关键字声明 和类不同const handleClick = async () => {// 若export default 接收到的就是default;否则接收到导出的const plus = await import('./index.js').then(res => res.default)// await + then 将res.default保存到resplus(1, 2)}return (<button onClick={handleClick}>getSum</button>)
}
ReactDOM.render(<Button />,document.getElementById('app')
)

13 代码分割之import静动态导入相关推荐

  1. React开发(202):react代码分割之import导入导出

  2. React开发(207):react代码分割之context的动态

  3. python 运维包_基础入门_Python-模块和包.运维开发中__import__动态导入最佳实践?

    常规导入:import module_name[,module1,...] from module_name import [*|child[,child1,...] from module_name ...

  4. python type help copyright_Python关于import的实验(8)__init__.py文件内部代码的执行以及内部的导入和内部的变量...

    Python官方文档参考链接: 常规包 Python 定义了两种类型的包,常规包 和 命名空间包. 常规包是传统的包类型,它们在 Python 3.2 及之前就已存在. 常规包通常以一个包含 __in ...

  5. 动态导入ECMAScript模块一文看懂

    import { concat } from './concatModule'使用ES模块的方式是静态的:意味着模块之间的依赖关系在编译时就已经知道了. ECMAScript(又名ES2015或ES) ...

  6. Webpack:代码分割

    webpack 版本:4.35.0 webpack-cli 版本:3.3.5 为什么需要代码分割 在当前的前端项目中,常常使用 gulp.webpack.Browserify 等将多个文件压缩合并成一 ...

  7. 动态化超详细完善的Excel动态导入Mysql,支持导入不同表,集成后只需配置就可以实现动态导入excel到数据库

    文章目录 项目开源代码 项目开源代码 1.环境 gradle Maven 2.需要用到的mysql表 导入数据存储日志信息表[pub_imp_excel_jd_log] 表信息[pub_imp_exc ...

  8. 【Webpack 性能优化系列(6) - code splitting 】通过代码分割来获取更小的 bundle,优化资源加载

    webpack系列文章: [Webpack 性能优化系列(9) - 多进程打包]极大的提升项目打包构建速度!!! [Webpack 性能优化系列(8) - PWA]使用渐进式网络应用程序为我们的项目添 ...

  9. 【Gazebo入门教程】第三讲 SDF文件的静/动态编程建模

    [Gazebo入门教程]第三讲 SDF文件的静/动态编程建模 文章目录 [Gazebo入门教程]第三讲 SDF文件的静/动态编程建模 一.自定义模型并导入Gazebo 1. 基础操作准备 2. 建立模 ...

最新文章

  1. K-Means聚类算法原理
  2. [ASP.NET MVC 小牛之路]10 - Controller 和 Action (2)
  3. “人工智能之父”艾伦·图灵登上英国50英镑新钞
  4. PcGAN:一种用于一次学习的噪声鲁棒条件生成对抗网络∗
  5. spring访问oracle函数,spring调用带参数的oracle函数应注意的问题
  6. C语言基本数据结构之一(线性链表的增,删,改,查及倒序)
  7. vscode python单步调试_调试期间VSCode python“未验证断点”?
  8. Alpha 冲刺 (1/10)
  9. Web服务器处理连接请求的四种架构方式
  10. excel手机版_手机自带便签如何导入新手机?试试这款便签同步助手
  11. P1603 斯诺登的密码-字符串加法的妙用
  12. 安卓抓包,为何总是 Tunnel to?
  13. 获取Unique reads方法
  14. 怎么看计算机电源型号,电脑电源铭牌怎么看?台式机电源铭牌知识扫盲 拒绝虚标!...
  15. 国产Linux系统下替代QQ和微信的不二之选
  16. [异能程序员]第四章 偶遇(第四更)
  17. 《降龙之剑》刷马坐标 BOSS坐标,鉴定出好马的时间段
  18. 合同比对系统,告别人工比对,差异比对率100
  19. python爬取电影天堂
  20. android创建以及使用SDcard镜像文件

热门文章

  1. 笔记本屏幕出现横条纹_笔记本支架+拓展坞+立式无线充:给你的桌面一个简单的品质升级...
  2. jdk 安装_Jdk 安装使用教程
  3. php页面空白如何解决,php页面空白怎么回事 php出现空白页的解决方法
  4. UnityEngine.UI.dll 路径
  5. GPU Gems1 - 11 阴影贴图反走样
  6. 利用matlab实现SAR 图像线性拉伸显示
  7. Kullback–Leibler divergence(相对熵,KL距离,KL散度)
  8. Visual Studio for Mac Preview离线下载安装
  9. ASP.NET Web API 中 特性路由(Attribute Routing) 的重名问题
  10. GMapbook中文版上线