动态引入script标签的改进方案

简介: 【10月更文挑战第5天】

背景:

  1. 需要动态判断环境,引入相应版本的(dev, prod的)react,react-dom

  2. 之前写的通过js去创建一个script标签,再append到head里,这个方案偶尔能出现react或者react-dom没加载到的问题,明明看network已经加载了,但是就是报ReactDOM is not defined 的bug,又或者是各种依赖ReactDOM的api报undefined错,多刷新几次偶尔能复现,导致白屏

解决:

  1. 发现如果手动写死script标签在head里,而不是js append进去,反而没有bug。但是现在需要判断环境,就不能写死

  2. 用的是webpack编译,用了一个html-webpack-plugin的插件,这个插件里面可以配置模板

    plugins: [
     new HtmlWebpackPlugin({
         
       template: './index.html',
       cdn: {
         
         js: process.env.NODE_ENV === 'production' ? [
           'cdn1.min.js',
           'cdn2.min.js'
           // ... 后续的production的cdn都可以写上
         ]: [
           'cdn1.dev.js',
           'cdn2.dev.js'
           // ... 后续的dev的cdn都可以写上
         ]
       },
     })
    ]
    

按照这个样子写了后,需要在index.html上写模板,在html的head上加入

<% for (var i in htmlWebpackPlugin.options.cdn&&htmlWebpackPlugin.options.cdn.js) {
    %>
      <script src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script>
    <% } %>

然后重启webpack,会发现编译的时候已经写入了,不再是js动态append进来的了

手动刷新页面100次,没有出现白屏的bug了

原因分析:
动态创建的标签默认带async,如果关闭了async,会有执行顺序的问题

image.png

但是如果启用async,则有多个脚本相互依赖的加载顺序问题
所以需要手动关闭async,手动开启defer

相关文章
|
XML 前端开发 数据格式
CSS引入方式这么多是什么优先级?
CSS引入方式这么多是什么优先级?
91 0
|
4月前
|
JavaScript 前端开发 Go
动态引入script标签的改进方案
动态引入script标签的改进方案
|
4月前
|
前端开发 JavaScript
【前端web入门第三天】01 css定义和引入方式 四种标签选择器
本文档详细介绍了CSS的基础知识及其应用。内容涵盖了CSS的定义、CSS在HTML中的引入方式,包括内部样式表、外部样式表及行内样式表的使用场景与方法。此外,还深入解析了不同种类的选择器:标签选择器、类选择器、ID选择器以及通配符选择器的功能与应用场景,并提供了实例帮助理解。最后,通过具体的新属性示例,指导如何使用这些选择器来实现基本的盒子绘制。适合初学者系统学习CSS。
66 15
|
移动开发 前端开发 HTML5
|
设计模式 JavaScript 前端开发
为什么说 Vue 的响应式更新精确到组件级别?(原理深度解析)
我们都知道 Vue 对于响应式属性的更新,只会精确更新依赖收集的当前组件,而不会递归的去更新子组件,这也是它性能强大的原因之一。
|
JavaScript
js基础笔记学习214元素得属性和节点1方式1
js基础笔记学习214元素得属性和节点1方式1
85 0
js基础笔记学习214元素得属性和节点1方式1
|
JavaScript
js基础笔记学习219属性节点2
js基础笔记学习219属性节点2
76 0
js基础笔记学习219属性节点2
|
JavaScript
js基础笔记学习218属性节点1
js基础笔记学习218属性节点1
76 0
js基础笔记学习218属性节点1
|
网络架构
【Node.js+koa--后端管理系统】设计标签创建、查询、接口 | 标签绑定到动态
【Node.js+koa--后端管理系统】设计标签创建、查询、接口 | 标签绑定到动态
180 0
【Node.js+koa--后端管理系统】设计标签创建、查询、接口 | 标签绑定到动态
|
JavaScript
1、引入Vue项目(直接引入、创建步骤、绑定文本/属性/方法)
1、引入Vue项目(直接引入、创建步骤、绑定文本/属性/方法)
162 0