重复引用怎么办?

好吧,其实就是个小问题,本文主要用途是第二部分记录import的详细用法~~

目录下存在三个js。

t1.js

console.log("test1");

t2.js

console.log("test2.0");
import t from "./t1.js"
console.log("test2.1");

t3.js

console.log("test3.0");
import t2_1 from "./t2.js"
console.log("test3.1");

执行t3.js结果:

test1
test2.0
test2.1
test3.0
test3.1

现在t3中套娃式多次引用

t3.js

console.log("test3.0");
import t2_1 from "./t2.js"
import t1 from "./t1.js"
import t2_2 from "./t2.js"
console.log("test3.1");

执行t3.js结果和未套娃前一致:

test1
test2.0
test2.1
test3.0
test3.1

通过案例证明多次引用同一个js不会导致重复引用,且优先执行最深层js文件中的代码
如果使用vue或uniapp等,同一个页面多次调用相同或不同组件,组件中又引用了重复js,结果也是一样:只引用一次相同js


import详细说明

静态的import 语句用于导入由另一个模块导出的绑定。无论是否声明了 strict mode ,导入的模块都运行在严格模式下。在浏览器中,import 语句只能在声明了 type=“module” 的 script 的标签中使用。

此外,还有一个类似函数的动态 import(),它不需要依赖 type=“module” 的script标签。

在 script 标签中使用 nomodule 属性,可以确保向后兼容。

在您希望按照一定的条件或者按需加载模块的时候,动态import() 是非常有用的。而静态型的 import 是初始化加载依赖项的最优选择,使用静态 import 更容易从代码静态分析工具和 tree shaking 中受益。

语法

import defaultExport from "module-name";
import * as name from "module-name";
import { export } from "module-name";
import { export as alias } from "module-name";
import { export1 , export2 } from "module-name";
import { foo , bar } from "module-name/path/to/specific/un-exported/file";
import { export1 , export2 as alias2 , [...] } from "module-name";
import defaultExport, { export [ , [...] ] } from "module-name";
import defaultExport, * as name from "module-name";
import "module-name";
var promise = import("module-name");//这是一个处于第三阶段的提案。

defaultExport
导入模块的默认导出接口的引用名。
module-name
要导入的模块。通常是包含目标模块的.js文件的相对或绝对路径名,可以不包括.js扩展名。某些特定的打包工具可能允许或需要使用扩展或依赖文件,它会检查比对你的运行环境。只允许单引号和双引号的字符串。
name
导入模块对象整体的别名,在引用导入模块时,它将作为一个命名空间来使用。
export, exportN
被导入模块的导出接口的名称。
alias, aliasN
将引用指定的导入的名称。

描述

name参数是“导入模块对象”的名称,它将用一种名称空间来引用导入模块的接口。export参数指定单个的命名导出,而import * as name语法导入所有导出接口,即导入模块整体。以下示例阐明该语法。

导入整个模块的内容

这将myModule插入当前作用域,其中包含来自位于/modules/my-module.js文件中导出的所有接口。

import * as myModule from '/modules/my-module.js';

在这里,访问导出接口意味着使用模块名称(在本例为“myModule”)作为命名空间。例如,如果上面导入的模块包含一个接口doAllTheAmazingThings(),你可以这样调用:

myModule.doAllTheAmazingThings();

导入单个接口

给定一个名为myExport的对象或值,它已经从模块my-module导出(因为整个模块被导出)或显式地导出(使用export语句),将myExport插入当前作用域。

import {myExport} from '/modules/my-module.js';

导入多个接口

这将foobar插入当前作用域。

import {foo, bar} from '/modules/my-module.js';

导入带有别名的接口

你可以在导入时重命名接口。例如,将shortName插入当前作用域。

import {reallyReallyLongModuleExportName as shortName}from '/modules/my-module.js';

导入时重命名多个接口

使用别名导入模块的多个接口。

import {reallyReallyLongModuleMemberName as shortName,anotherLongModuleName as short
} from '/modules/my-module.js';

仅为副作用而导入一个模块

整个模块仅为副作用(中性词,无贬义含义)而导入,而不导入模块中的任何内容(接口)。 这将运行模块中的全局代码, 但实际上不导入任何值。

import '/modules/my-module.js';

导入默认值

引入模块可能有一个defaultexport(无论它是对象,函数,类等)可用。然后可以使用import语句来导入这样的默认接口。

最简单的用法是直接导入默认值:

import myDefault from '/modules/my-module.js';

也可以同时将default语法与上述用法(命名空间导入或命名导入)一起使用。在这种情况下,default导入必须首先声明。 例如:

import myDefault, * as myModule from '/modules/my-module.js';
// myModule used as a namespace

或者

import myDefault, {foo, bar} from '/modules/my-module.js';
// specific, named imports

当用动态导入的方式导入默认导出时,其工作方式有所不同。你需要从返回的对象中解构并重命名 “default” 键。

(async () => {if (somethingIsTrue) {const { default: myDefault, foo, bar } = await import('/modules/my-module.js');}
})();

动态import

标准用法的import导入的模块是静态的,会使所有被导入的模块,在加载时就被编译(无法做到按需编译,降低首页加载速度)。有些场景中,你可能希望根据条件导入模块或者按需导入模块,这时你可以使用动态导入代替静态导入。下面的是你可能会需要动态导入的场景:

  • 当静态导入的模块很明显的降低了代码的加载速度且被使用的可能性很低,或者并不需要马上使用它。
  • 当静态导入的模块很明显的占用了大量系统内存且被使用的可能性很低。
  • 当被导入的模块,在加载时并不存在,需要异步获取
  • 当导入模块的说明符,需要动态构建。(静态导入只能使用静态说明符)
  • 当被导入的模块有副作用(这里说的副作用,可以理解为模块中会直接运行的代码),这些副作用只有在触发了某些条件才被需要时。(原则上来说,模块不能有副作用,但是很多时候,你无法控制你所依赖的模块的内容)

请不要滥用动态导入(只有在必要情况下采用)。静态框架能更好的初始化依赖,而且更有利于静态分析工具和tree shaking发挥作用

关键字import可以像调用函数一样来动态的导入模块。以这种方式调用,将返回一个 promise。

import('/modules/my-module.js').then((module) => {// Do something with the module.});

这种使用方式也支持 await 关键字。

let module = await import('/modules/my-module.js');

示例

标准导入

下面的代码将会演示如何从辅助模块导入以协助处理AJAX JSON请求。

  • 模块:file.js
function getJSON(url, callback) {let xhr = new XMLHttpRequest();xhr.onload = function () {callback(this.responseText)};xhr.open('GET', url, true);xhr.send();
}export function getUsefulContents(url, callback) {getJSON(url, data => callback(JSON.parse(data)));
}
  • 主程序:main.js
import { getUsefulContents } from '/modules/file.js';getUsefulContents('http://www.example.com',data => { doSomethingUseful(data); });

动态导入

此示例展示了如何基于用户操作去加载功能模块到页面上,在例子中通过点击按钮,然后会调用模块内的函数。当然这不是能实现这个功能的唯一方式,import()函数也可以支持await。

const main = document.querySelector("main");
for (const link of document.querySelectorAll("nav > a")) {link.addEventListener("click", e => {e.preventDefault();import('/modules/my-module.js').then(module => {module.loadPageInto(main);}).catch(err => {main.textContent = err.message;});});
}

规范

Specification
“function-like” dynamic import() proposal
ECMAScript (ECMA-262)
Imports


转载自:《import》

javascript学习笔记 - import存在重复引用js问题么(附详细import说明)相关推荐

  1. 千锋JavaScript学习笔记

    千锋JavaScript学习笔记 文章目录 千锋JavaScript学习笔记 写在前面 1. JS基础 1.1 变量 1.2 数据类型 1.3 数据类型转换 1.4 运算符 1.5 条件 1.6 循环 ...

  2. 【JavaScript学习笔记2】JS中常见的输出方式-控制台输出信息

    引言 在编程开发的过程中,输出信息是非常必要的.JS中提供了四种输出方式:弹出显示框.控制台输出.弹出输入框.弹出判断显示框 弹出显示框 这种方式在上一篇笔记中已经详细介绍,有需要学习的朋友可以跳转到 ...

  3. JavaScript学习笔记之入门篇

    JavaScript学习笔记之入门篇 JavaScript引入 1. 页面级 js: 2. 外部js文件: JavaScript变量 1. 变量的作用: 2. 声明变量: 3. 变量赋值: 4. 单一 ...

  4. JavaScript学习笔记(五)

    JavaScript学习笔记(五) ①Array类 本地对象 ②Date类 ①Global对象 对象的类型   内置对象 ②Math对象 宿主对象 今天继续学习JS中的对象,昨天内置对象Global对 ...

  5. JavaScript学习笔记04【高级——DOM和事件的简单学习、BOM对象】

    w3school 在线教程:https://www.w3school.com.cn JavaScript学习笔记01[基础--简介.基础语法.运算符.特殊语法.流程控制语句][day01] JavaS ...

  6. JavaScript学习笔记01【基础——简介、基础语法、运算符、特殊语法、流程控制语句】

    w3school 在线教程:https://www.w3school.com.cn JavaScript学习笔记01[基础--简介.基础语法.运算符.特殊语法.流程控制语句][day01] JavaS ...

  7. JavaScript学习笔记之DOM篇,带你全面了解什么是DOM

    DOM在前面的JavaScript学习笔记(一)–JS基础里简单提到过,它是浏览器厂商提供的用来控制html / css 的代码的文档对象模型,是JavaScript的重要组成部分,现在带大家详细了解 ...

  8. JavaScript学习笔记(三)--操作运算符

    JavaScript中的运算符有很多,主要分为算术运算符,比较运算符,逻辑运算符,三目运算符.一元运算符.位运算符等.这些运算符都有一些属于自己的运算规则,下面就为大家介绍一下JavaScript中的 ...

  9. day03_js学习笔记_03_js的事件、js的BOM、js的DOM

    day03_js学习笔记_03_js的事件.js的BOM.js的DOM ================================================================ ...

最新文章

  1. Python夺冠,老牌编程语言该走向何方?网友:崩溃
  2. Nat. Mach. Intell. | 探索稀疏化学空间的化学语言模型新策略
  3. <笔记2>numpy的生成随机数用法小记
  4. ASP.NET 2.0中如何连接到Mysql(转)
  5. php把数组转为字符串函数,php把数组转为字符串用什么函数
  6. thinkcmf安装模板需要点击右键打开新页面的解决办法
  7. golang 并发实践
  8. 怎么绘制机械孔_机械制图中常用的图纸简化画法,相当适合初学者!
  9. android 截屏_图文小编福利:Apowersoft专业截屏王
  10. leetcode题目及答案python_leetcode Python算法题(20)-----多题
  11. 九度 题目1394:五连击数组
  12. Keil系列教程(汇总)
  13. C++(数据结构与算法):16---特殊矩阵的实现(对角矩阵、三对角矩阵、下三角矩阵、上三角矩阵、对称矩阵)
  14. 小米蓝牙耳机使用说明_小米10手机专用?小米“真无线蓝牙耳机Air 2s”评测
  15. 坚果pro2刷Nitrogen OS安卓pie纯正原生
  16. QQ安装包内置UE4是什么意义呢?会不会是奔着元宇宙,搭载了虚幻引擎的QQ在渲染数字孪生上表现更强劲?
  17. 京东大数据方向-Java方向-实习面经一面二面(offer没去。。。)
  18. 计算机网络的简单实验
  19. 微信公众号发送汉字乱码
  20. python logging配置时间或大小轮转

热门文章

  1. STC单片机在线ISP IAP OTA
  2. H.264码流分析仪
  3. 纳米级完全删除MYSQL5.7以及一些吐槽
  4. 高中计算机专业课程英语,信息技术与中学英语课程的整合
  5. 【HTML】在图标上绘制圆圈数字提示符
  6. ITPUB老帖子:将查询结果连接成列表的几个方法
  7. mysql-MDL元数据锁
  8. 基于 mini2440 电阻式触摸屏:电阻式触摸屏工作原理
  9. 2022软工出发-阅读和调研-构建之法与CICD与版本管理
  10. 机房对决(双人小游戏)