Javascript模块化机制实现原理详解


Posted in Javascript onApril 02, 2020

1. 概述

js发展初期暴露了其缺陷:缺乏模块,后来提出了commonJS规范来规范其模块的规范。作为JavaScript新手,发现对于其JavaScript的模块机制,不是很理解。我查阅了一些资料整理了JavaScript CommonJS的原理和机制。

2. JavaScript

2.1 无后端的项目

这类项目不能使用CommonJS的模块规范,这是我起初所犯的错误。在没有es6被大多数浏览器支持的时候,js文件充斥着var和function,由此引来了命名冲突和污染,使得JavaScript代码很复杂。es6的class概念出现有效规范了JavaScript的模块化规范。由于这类项目只能通过script标签引入,我们在这里讲一下script标签的相关知识。

每当浏览器解析到<script>标签(无论内嵌还是外链)时,浏览器会优先下载、解析并执行该标签中的javaScript代码,而阻塞了其后所有页面内容的下载和渲染。根据上述对<script>标签特性的描述,我们知道,在该示例中,当浏览器解析到<script>标签时,浏览器会停止解析其后的内容,而优先下载脚本文件,并执行其中的代码,这意味着,其后的test.css样式文件和<body>标签都无法被加载,由于<body>标签无法被加载,那么页面自然就无法渲染了。因此传统做法是
假定point.js文件:

//定义类
class Point {
 constructor(x, y) {
  this.x = x;
  this.y = y;
 }

 toString() {
  return '(' + this.x + ', ' + this.y + ')';
 }
}

则在index.js中引入point.js,这需要在index.html中body的尾部

<script src="point.js"></script>
<script src="index.js"></script>

这样就可以在index.js使用point类了。

总结下来:

js类库必须在header中引入,保证对之后script引入的js文件的支持,毕竟script标签的执行顺序是顺序执行,script标签引入顺序和实际引入顺序相同。

自定义的script标签引入的js文件,要放在body的尾部,保证DOM元素渲染结束。

每个js文件尽量是es6 class对象,避免作用域和命名域的冲突。

2.2 后端 服务器 NodeJS

模块引用的实例如下:require方法

const math = require("math");

模块的定义:

上下文提供了exports对象用于导出当前模块方法和变量,并且它是唯一的导出出口。在模块中,还存在一个module对象,他代表模块自身,exports是module对象的属性。导出方式:

// math.js
exports.add = function () { };
module.exports.add = function () { };

2.3 后端 es6的module

ES6模块不是对象,而是通过export命令显式指定输出的代码,输入时也采用静态命令的形式。

由于ES6模块是编译时加载,使得静态分析成为可能。有了它,就能进一步拓宽JavaScript的语法,比如引入宏(macro)和类型检验(type system)这些只能靠静态分析实现的功能。

除了静态加载带来的各种好处,ES6模块还有以下好处:

不再需要UMD模块格式了,将来服务器和浏览器都会支持ES6模块格式。目前,通过各种工具库,其实已经做到了这一点。

将来浏览器的新API就能用模块格式提供,不再必要做成全局变量或者navigator对象的属性。

不再需要对象作为命名空间(比如Math对象),未来这些功能可以通过模块提供。

浏览器使用ES6模块的语法如下:

导出对象和变量:

var firstName = 'XXX';
var lastName = 'YYY';
export {firstName, lastName};
Point.js
// 导出类对象
export default class Point extends circle {
}

引入module

import Point from "Point";

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
greybox——不开新窗口看新的网页
Feb 20 Javascript
javascript XML数据显示为HTML一例
Dec 23 Javascript
jQuery入门知识简介
Mar 04 Javascript
javascript 45种缓动效果 非常酷
Jun 28 Javascript
jquery图片不完全按比例自动缩小的简单代码
Jul 29 Javascript
使用CSS样式position:fixed水平滚动的方法
Feb 19 Javascript
node.js中的http.response.getHeader方法使用说明
Dec 14 Javascript
js判断手机浏览器操作系统和微信浏览器的方法
Apr 30 Javascript
微信小程序 wx.request(接口调用方式)详解及实例
Nov 23 Javascript
示例vue 的keep-alive缓存功能的实现
Dec 13 Javascript
Vue中的验证登录状态的实现方法
Mar 09 Javascript
详解vue在项目中使用百度地图
Mar 26 Javascript
sharp.js安装过程中遇到的问题总结
Apr 02 #Javascript
viewer.js一个强大的基于jQuery的图像查看插件(支持旋转、缩放)
Apr 01 #jQuery
Selenium执行Javascript脚本参数及返回值过程详解
Apr 01 #Javascript
vue+render+jsx实现可编辑动态多级表头table的实例代码
Apr 01 #Javascript
js实现数据导出为EXCEL(支持大量数据导出)
Mar 31 #Javascript
Vue路由守卫及页面登录权限控制的设置方法(两种)
Mar 31 #Javascript
Vue-router 报错NavigationDuplicated的解决方法
Mar 31 #Javascript
You might like
用Json实现PHP与JavaScript间数据交换的方法详解
2013/06/20 PHP
XAMPP安装与使用方法详细解析
2013/11/27 PHP
本地计算机无法启动Apache故障处理
2014/08/08 PHP
YiiFramework入门知识点总结(图文教程)
2015/12/28 PHP
Yii2处理密码加密及验证的方法
2019/05/12 PHP
JavaScript中的eval()函数详解
2013/08/22 Javascript
jquery新的绑定事件机制on方法的使用方法
2014/04/15 Javascript
Javascript常用字符串判断函数代码分享
2014/12/08 Javascript
Node.js中.pfx后缀文件的处理方法
2017/03/10 Javascript
Angular项目从新建、打包到nginx部署全过程记录
2017/12/09 Javascript
浅谈vue-router 路由传参的方法
2017/12/27 Javascript
原生JavaScript实现的简单放大镜效果示例
2018/02/07 Javascript
vue中Npm run build 根据环境传递参数方法来打包不同域名
2018/03/29 Javascript
JS简单实现动态添加HTML标记的方法示例
2018/04/08 Javascript
浅谈vue-cli 3.0.x 初体验
2018/04/11 Javascript
layui实现下拉复选功能的例子(包括数据的回显与上传)
2019/09/24 Javascript
vue 关闭浏览器窗口的时候,清空localStorage的数据示例
2019/11/06 Javascript
使用node-media-server搭建一个简易的流媒体服务器
2021/01/20 Javascript
Python实现去除列表中重复元素的方法小结【4种方法】
2018/04/27 Python
详解python爬虫系列之初识爬虫
2019/04/06 Python
python绘制评估优化算法性能的测试函数
2019/06/25 Python
Python之Class&amp;Object用法详解
2019/12/25 Python
Python实现钉钉/企业微信自动打卡的示例代码
2021/02/02 Python
浅谈HTML5 &amp; CSS3的新交互特性
2016/07/19 HTML / CSS
HTML5添加禁止缩放功能
2017/11/03 HTML / CSS
雅诗兰黛旗下走天然植物路线的彩妆品牌:Prescriptives
2016/08/14 全球购物
墨尔本最受欢迎的复古风格品牌:Princess Highway
2018/12/21 全球购物
俄罗斯电子产品在线商店:UltraTrade
2020/01/30 全球购物
爱情检讨书大全
2014/01/21 职场文书
2014年寒假社会实践活动心得体会
2014/04/07 职场文书
股权转让协议书范本
2014/04/12 职场文书
2014年党员加强作风建设思想汇报
2014/09/15 职场文书
观后感的写法
2015/06/19 职场文书
幼儿园班级管理心得体会
2016/01/07 职场文书
2016中秋节月饼促销广告语
2016/01/28 职场文书
24年收藏2000多部退役军用电台
2022/02/18 无线电