js文件模块化引用问题(JavaScript modules)

news2024/12/23 14:10:33

有个前端项目,需要用到配置文件。这个配置文件实在是太大了,就想拆成多个小的,然后一一引入,组合成一个完整的配置文件。

如果是vue代码,这种情况根本是手到擒来,不费吹灰之力,而该前端项目是个普通的js程序。但其实,在编写VUE代码过程中,我们所熟知的import,export,并不是VUE的语法,而是js es6(?)的语法。所以,虽然不是VUE项目,现在一般的浏览器都能支持js代码中使用import和export。

思路是这样的:

1)将配置文件拆成一个主配置文件,以及多个小的js文件
2)每个小js文件里将内容通过export输出
3)在主配置文件中import这些小js文件
4)在html页面中引入该主配置文件,引入时,<script> 标记里需要加上 type=“module” 属性。

结果出来的问题就是,引入主配置文件后,里面的内容外部好像获取不到,说是没有定义,not defined。

究其原因,主要集中在2点:

1)通过<script type=“module” src="js模块文件’ />引入的js模块文件,里面的变量不是全局性的,而是模块内部的
2)上面的加载语句,加载出来的内容,只有等到页面全部加载完毕后才能访问,一般放在window.onload事件里处理

下面是详细介绍。
1、小配置文件

//hjzl.js
export default [
  {
    pid: "hjzl",
    id: "hjzl-water",
    name: "花果山环境质量",
    type: "group",
    open: true,
  },
  {
    pid: "hjzl-water",
    id: "hjzl-water-2022",
    name: "2022年东海海水质量",
    type: "group",
    open: false,
  },
  {
    pid: "hjzl-water",
    id: "hjzl-water-2022",
    name: "2021年东海海水质量",
    type: "group",
    open: false,
  },  
];  

第一种引用方式

2、主配置文件
//config.js

import baseMaps from "./_baseMaps.js";
import baseLayers from "./_baseLayers.js";
import hjzl from "./_hjzl.js";
import hjjc from "./_hjjc.js";
import hjjg from "./_hjjg.js";
import hjyj from "./_hjyj.js";
import widgets from "./_widgets.js";

//注意是window.config
window.config = {
  title: "花果山水帘洞新时代幺百零八五规划",
  plans: [...baseLayers, ...hjzl, ...hjjc, ...hjjg, ...hjyj],
};

3、html

<!DOCTYPE html>
<html lang="zh-cn">
  <head>
    <meta charset="utf-8" />
    <title>齐天大圣府办公室</title>
    
    <script type="module" src="./config.js">
    </script>
    
    <script>
	    if (window.addEventListener) {
	      // W3C standard
	      window.addEventListener("load", _init, false); // NB **not** 'onload'
	    } else if (window.attachEvent) {
	      // Microsoft
	      window.attachEvent("onload", _init);
	    }
	    function _init() {
	      console.log(config);
	    }    
	</script>
  </head>

第二种引用方式

2、主配置文件
//config.js

import baseMaps from "./_baseMaps.js";
import baseLayers from "./_baseLayers.js";
import hjzl from "./_hjzl.js";
import hjjc from "./_hjjc.js";
import hjjg from "./_hjjg.js";
import hjyj from "./_hjyj.js";
import widgets from "./_widgets.js";

//export ...
export default {
  title: "花果山水帘洞新时代幺百零八五规划",
  plans: [...baseLayers, ...hjzl, ...hjjc, ...hjjg, ...hjyj],
};

3、html

<!DOCTYPE html>
<html lang="zh-cn">
  <head>
    <meta charset="utf-8" />
    <title>齐天大圣府办公室</title>
    
    <script type="module">
      import config from "./config.js";
    </script>
    
    <script>
	    if (window.addEventListener) {
	      // W3C standard
	      window.addEventListener("load", _init, false); // NB **not** 'onload'
	    } else if (window.attachEvent) {
	      // Microsoft
	      window.attachEvent("onload", _init);
	    }
	    function _init() {
	      console.log(config);
	    }    
	</script>
  </head>

有关js文件加载顺序

在这里插入图片描述
我猜这幅图的意思是,
1)通常js文件下载时,是下载完js并执行,html的解析会受到中断和阻塞;
2)如果加上属性defer,那么下载js和解析html会并行,并且直到所有html加载完毕才执行该js
3)如果加上属性async,下载js和解析html会并行,然后中断html,执行js
4)如果type=“module”,那么就跟加defer属性一样。当然,module文件里有可能会引用其他module,它们也是并行下载的
5)如果type="module"同时async,参考3

所以,type="module"的情况下,js会在html加载完毕才执行,因此,module里面的内容只有放在window.onload里才能处理。

参考文章:

https://v8.dev/features/modules#defer

https://javascript.info/modules-intro

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/25918.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(WRF-UCM)高精度城市化气象动力模拟技术

气候变化及应对是政府、科学界及商业界关注的焦点。气候是多个领域&#xff08;生态、水资源、风资源及碳中和等问题&#xff09;的主要驱动因素&#xff0c;合理认知气候变化有利于解释生态环境变化机理及过程&#xff0c;而了解现在、未来气候变化则是进行生态、环境及能源评…

vs2022 编译遇见编译器堆空间不足,解决办法(针对CMAKE工程)

1、原因&#xff1a; 就是编译工程文件太大&#xff0c;导致堆栈溢出。原始vs默认的编译器是32位&#xff0c;我们设置为64位就可解决部分问题。 具体可能造成的原因可以参考&#xff1a; 错误 C1060 |微软学习 (microsoft.com) 2、解决&#xff1a; 1、需要提前安装cmake…

iOS关于搜索不规则瀑布流布局的实现小结

最近在项目开发中遇到了不规则搜索布局的问题。 之前常用的解决方案是用一个tableview用一个循环动态的加载&#xff0c;唯一的缺点是需要动态的移除&#xff0c;其实也已经足够。ios搜索历史记录不规则布局-IOS代码类资源-CSDN下载&#xff0c;需要的话可以下载使用。请教了一…

双向链表的实现

这里以结构体的方式来实现链表&#xff0c;也可以使用类。结构体在没有修饰符的情况下&#xff0c;默认是共有访问。如有不对&#xff0c;希望能指出。 目录 一、链表和结点结构体的声明 (ListNode.h) 二、链表各个功能的实现 1、增 (1) 构造函数&#xff08;创建链表头结点…

简历上写着“精通 MySQL”,阿里面试官非要跟我死磕,最后还是给我发了 offer

事情是这样的 前段时间因为想要跳槽就去面试了下阿里&#xff0c;大家也都清楚&#xff0c;精通这个词在简历上属于很难把握住的一个词&#xff0c;如果你在你的简历上面写着你精通 XX 技术&#xff0c;那面试官就会默认你是真的很会&#xff0c;刨根问底问到你崩溃。 我之前…

【踩坑】工作中真实踩坑,一个or让sql变慢7倍

工作中真实踩坑&#xff0c;一个or让sql变慢1000倍1.情况说明2.解释计划3.or改成union4.总结1.情况说明 测试环境&#xff0c;有两张表&#xff0c;分别是讲师表t_train_lecturer(后面简称B表&#xff09;,和讲师的授课时长表t_train_activity&#xff08;后面简称A表&#xf…

opencv 图像平滑

高通滤波可以找到图像的边缘。低通滤波可以去除噪音&#xff0c;模糊图像。 自定义滤波器 cv2.filter2D() import cv2 import numpy as np from matplotlib import pyplot as pltimg cv2.imread(img1.png) imgcv2.cvtColor(img,cv2.COLOR_BGR2RGB) kernel np.ones((5, 5), n…

2022年11月10篇论文推荐

随着最大的人工智能研究会议(NeurIPS 2022)即将到来&#xff0c;我们进入了2022年的最后阶段。让我们回顾一下人工智能世界最近发生了什么。 在介绍推荐论文之前&#xff0c;先说一个很有意思的项目&#xff1a; img-to-music:想象图像听起来是什么样的模型! https://hugging…

人工智能和自动驾驶业务将是百度未来的最强增长动力

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 虽然百度(BIDU)长期以来一直缺乏增长动力&#xff0c;但猛兽财经认为现在可能是投资百度股票的时候了。因为我们认为百度在未来有几个可以实现强劲增长的动力。首先&#xff0c;百度可以利用其在中国自动驾驶市场的领先地位…

如何验证ARP缓存表最多能缓存多少条动态条目

ARP协议原理、ARP缓存表目的,这些在我的文章中已经反复提及过多次了。ARP缓存表里有静态和动态条目两种,静态的是写死的,没有老化时间,不会随着时间的流逝而自动删除。动态条目是缓存的,有老化时间timeout,如果长时间没有刷新,老化时间到了就会自动删除。老化时间是一个…

智能服务机器人产品及解决方案

产品概述 随着人工智能&#xff08;AI&#xff09;领域技术的不断发展和演进&#xff0c;面向人工智能的领域应用也越来越被更多的企业关注。信迈作为中国领先的创新型软件及信息技术服务商&#xff0c;一直致力于人工智能领域技术的探索和实践。 信迈凭借自身雄厚的技术能力…

Cookie注入和X-Forwarded-For注入

&#x1f4aa;&#x1f4aa;Cookie注入和X-Forwarded-For注入一 .Cookie注入1.创建漏洞环境2.漏洞攻击2.1判断是否有注入2.2信息收集2.3注入获取数据库名2.4注入获取表名2.5注入获取列名2.6注入获取信息3.sql靶场实战二. X-Forwarded-For注入1.创建漏洞环境2.漏洞攻击2.1判断是…

浅析Betaflight中的OSD叠加程序【MAX7456AT7456】

前言&#xff1a;想要对OSD下手已经不是头一次了&#xff0c;前几次都浅尝辄止。一个是能力不够&#xff0c;BetaFlight的代码体系太庞大了&#xff0c;看不懂也摘不出来。 这次要做一款带osd功能的接收机&#xff08;用在遥控车上&#xff09;&#xff0c;所以又来打飞控程序…

[附源码]java毕业设计校园快递管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

1万属性,100亿数据,每秒10万吞吐,架构如何设计?

有一类业务场景&#xff0c;没有固定的schema存储&#xff0c;却有着海量的数据行数&#xff0c;架构上如何来实现这类业务的存储与检索呢&#xff1f;58最核心的数据“帖子”的架构实现技术细节&#xff0c;今天和大家聊一聊。一、背景描述及业务介绍什么是58最核心的数据&…

深度学习入门(四十四)计算机视觉——多尺度目标检测

深度学习入门&#xff08;四十四&#xff09;计算机视觉——多尺度目标检测前言计算机视觉——多尺度目标检测教材1 多尺度锚框2 多尺度检测3 小结前言 核心内容来自博客链接1博客连接2希望大家多多支持作者 本文记录用&#xff0c;防止遗忘 计算机视觉——多尺度目标检测 教…

【Hack The Box】linux练习-- Postman

HTB 学习笔记 【Hack The Box】linux练习-- Postman &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月17日&#x1f334; &#x1f…

大学生旅游风景主题dreamweaver网页设计大作业-陕西渭南HTML+CSS制作网页

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法&#xff0c;如盒子的嵌套、浮动、margin、border、background等属性的使用&#xff0c;外部大盒子设定居中&#xff0c;内部左中右布局&#xff0c;下方横向浮动排列&#xff0c;大学学习的前端知识点和布局方式都有…

从不学无术到架构师Leader:这份java面试知识宝典,一举斩获京东T8

前言 面试了大大小小各种公司&#xff0c;有BAT的&#xff0c;上市的&#xff0c;AB各种轮的&#xff0c;初创的……今天大概列举了下&#xff0c;至少有30家公司。 在这里我总结了求职面试需要注意的各种问题&#xff0c;希望可以用我收集的《Java面试核心知识笔记》及面试经…

element UI 组件封装--搜索表单(含插槽和内嵌组件)

组件封装–搜索表单 searchForm.vue 可根据需要&#xff0c;参考姓名和工作自行增加更多常用的默认搜索项 <template><div style"padding: 30px; width: 300px"><el-formref"searchFormRef":model"searchData":label-width"…