首页 > 编程语言 >JavaScript 模块化

JavaScript 模块化

时间:2024-03-20 16:32:53浏览次数:31  
标签:exports const 模块化 JavaScript js 模块 加载

JavaScript 模块化

image.png

JavaScript 的历史问题

背景

JavaScript 在一开始诞生的时候只是用来网页脚本的开发,其实没有模块化和命名空间的概念。

JS 的模块化需求日益增长。

幼年期:无模块化

模块化思维的萌芽。

  1. 需要在页面中加载不同的 js:动画库,表单库,格式化工具
  2. 多种 js 文件被分在了不同的文件中
  3. 不同的文件又被同一个模版所引入

我们的解决方案是,在一个 html 中,引入不同的 script,这样实现了一个模版引入多个不同的 js。

这个其实也是有意义的,可以认为是 js 模块化的第一步。

这里补充一下 script 标签的三个参数:

  • normal:遇到标签,停止往下解析,下载且执行 JavaScript
  • async:解析到标签开始异步下载,下载完之后立即执行,并且会阻塞渲染,然后继续执行
  • defer:解析到标签开始异步下载,继续解析

(分别对应:normal,defer,async)

image.png

依然存在的问题:

  • 兼容性
  • 问题方向:浏览器渲染原理、同步异步原理、模块化加载原理
  • 污染全局作用域:不易于大型项目的开发和多人项目的合作

image.png

成长期:模块化初心 IIFE

作用域的把控
let count = 0

const increase = () => {
	count++
}

const rest = () => {
	count = 0
}

increase()
rest()

(
	// 利用立即执行行数
	() => {
		let count = 0

		const increase = () => {
			count++
		}

		const rest = () => {
			count = 0
		}

		increase()
		rest()
	}
)()

这样我们使用了 IIFE module 实现了模块和外部之间的隔离。

成熟期

CJS - commonjs

nodejs 制定的标准。

  • 特征:通过 module + export 去对外暴露接口
  • 通过 require 去调用其他的模块,同步加载

模块组织方式:

main.js

// 引入部分
const dependecyModule1 = require('./dependecyModule1')
const dependecyModule2 = require('./dependecyModule2')

// 核心逻辑
let count = 0
const increase = () => count++
const reset = () => count = 0

// 暴露接口部分
export.increase = increase
export.reset = reset

// 或者统一暴露
module.exports = {
	increase,reset
}

使用

const {increase, reset} = require('main.js')

commonjs 为每一个模块提供了一个 exports 变量,指向 module.exports,相当于在每一个模块代码的头部写了一行:

var exports = module.exports

exports 和 module.exports 指向同一个内存空间,module.exports 是真正的暴露对象。exports 是 module.exports 对象的引用。

commonjs 的特点:

  • 使用同步加载的方式,适用于服务端,因为服务端的代码阻塞用户无法感知,而前端的阻塞会非常影响体验
  • 所有的代码都运行在某块作用域中,不会影响全局
  • 模块可以多次加载,但是只是第一次会下载,后面用的都是缓存
  • 模块加载的顺序就是代码出现的顺序

AMD(Asynchronous Module Definition)

采用异步加载的方式加载模块,模块的加载不影响后面语句的运行,所有依赖这个模块的语句都会被写在一个回调函数中,等待加载完成之后,这个回调函数才会执行。

最热门的一个库就是 require.js,它是一个 JavaScript 模块化框架。

requirejs(["helper/util"], function(util) {
    //This function is called when scripts/helper/util.js is loaded.
    //If util.js calls define(), then this function is not fired until
    //util's dependencies have loaded, and the util argument will hold
    //the module value for "helper/util".
});

CMD(Common Module Definition)

通用加载模块

常见的库就是 sea.js

UMD(Universal Module Definition)

UMD是AMD和CommonJS的糅合。

UMD的实现很简单:

  • 先判断是否支持Node.js模块(exports是否存在),存在则使用Node.js模块模式。
  • 再判断是否支持AMD(define是否存在),存在则使用AMD方式加载模块。
  • 前两个都不存在,则将模块公开到全局(window或global)。

ES6 模块化

编译时去顶模块的依赖关系,原生支持。

标签:exports,const,模块化,JavaScript,js,模块,加载
From: https://blog.csdn.net/weixin_54252035/article/details/136880817

相关文章

  • javascript:void(0);用法及常见问题解析
    javascript:void(0);是一个常见的JavaScript代码片段,通常用于在HTML中作为超链接的href属性值或者事件处理函数的返回值。下面是关于它的用法和常见问题的解析:用法:作为超链接的href属性值:<ahref="javascript:void(0);">点击这里</a>这样做的作用是让点击链......
  • 【编程向导】JavaScript-基础语法-语句和声明二期讲解
    switch语句switch语句允许一个程序求一个表达式的值并且尝试去匹配表达式的值到一个case标签。如果匹配成功,这个程序执行相关的语句。语法switch(expression){casevalue_1:statements_1[break;]casevalue_2:statements_2[br......
  • 4.零基础Nodejs快速入门——Node.js 模块化
    Node.js模块化一、介绍1.1什么是模块化与模块?将一个复杂的程序文件依据一定规则(规范)拆分成多个文件的过程称之为模块化其中拆分出的每个文件就是一个模块,模块的内部数据是私有的,不过模块可以暴露内部数据以便其他模块使用1.2什么是模块化项目?......
  • 前端基础之JavaScript的数据类型
    一、常用的调试语句方法说明示例归属alert(msg);警告,在浏览器中弹出一个警告框,内容为alert里面的内容alert("Surprise");浏览器closole.log(msg);控制台,在控制台内输出一些内容console.log("Surprise");浏览器prompt(问题,值);对话框,第一个参数是询问内......
  • 前端基础之JavaScript引入
    一、什么是JavaScriptJavaScript是一门跨平台、面向对象的脚本语言(不需要编译,直接解释运行即可),来控制网页的行为,它能使网页可交互。脚本语言:不需要编译,运行过程中由js解释器(js引擎)逐行来进行解释并执行。现在也可以基于Node.js技术进行服务器端编程W3C标准:网页主要由......
  • 使用Selenium执行JavaScript脚本:探索Web自动化的新领域
    前言在我们使用selenium进行自动化测试的时候,selenium能够帮助我们实现元素定位和点击输入等操作,但是有的时候,我们会发现,即使我们的元素定位没有问题,元素也无法执行操作;也有部分情况是我们无法直接定位滚动条河时间控件来进行操作,这个时候,我们就需要借助JavaScript来解决问题。......
  • JavaScript笔记 01
    目录01js概述02js代码的基本使用03js变量的基本使用04变量的类型05数值类型06字符串类型07布尔类型08 使用typeof查看变量的类型09其他类型转换为字符串类型10其他数据类型转换为数值型11其他数据类型转换成布尔类型12小知识点01js概述前端的三......
  • 【JavaScript编程实操10】1.实现一个函数,要求传递2个参数,返回两个参数的和 2.创建一个
    前言1、实现一个函数,要求传递2个参数,返回两个参数的和代码:实现效果:2、创建一个函数,传递两个参数,返回两个参数的相乘和相加的和代码:实现效果:总结前言    本次继续针对Javascript阶段的函数与对象相关方面的实操练习,共有2个实操,这两个实操具有相似性,只是一个......
  • JavaScript学习笔记6: 对象 - 字符串Stirng
    JS对象-字符串String字符串的创建方式<script>//字符串创建方式1varstr1=newString("str1");//字符串创建方式2varstr2="str2";</script>字符串属性&方法length属性<script>console.log("获取字符串的length属性");    con......
  • JavaScript学习笔记7: 对象 - 自定义对象&JSON
    JS对象-自定义对象&JSON自定义对象类似java的类Json的所有属性(key)需要用双引号包围,本质是字符串<script>    varuser={    name:"tom",    age:10,    gender:"male",    //eat:function(){}    //可以简写为    eat(){//自......