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 相关文章推荐
让innerHTML的脚本也可以运行起来
Jul 01 Javascript
Jquery实现无刷新DropDownList联动实现代码
Mar 08 Javascript
js捕获鼠标右键菜单中的粘帖事件实现代码
Apr 01 Javascript
js判断两个日期是否相等的方法
Sep 10 Javascript
jQuery绑定自定义事件的魔法升级版
Jun 30 Javascript
详解使用Vue.Js结合Jquery Ajax加载数据的两种方式
Jan 10 Javascript
es6+angular1.X+webpack 实现按路由功能打包项目的示例
Aug 16 Javascript
详解React native全局变量的使用(跨组件的通信)
Sep 07 Javascript
vue.js 实现点击按钮动态添加li的方法
Sep 07 Javascript
微信小程序实现单列下拉菜单效果
Apr 25 Javascript
Vue中使用Lodop插件实现打印功能的简单方法
Dec 19 Javascript
修改NPM全局模式的默认安装路径的方法
Dec 15 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
使用数据库保存session的方法
2006/10/09 PHP
PHP has encountered an Access Violation
2007/01/15 PHP
PHP使用strstr()函数获取指定字符串后所有字符的方法
2016/01/07 PHP
PHP实现批量重命名某个文件夹下所有文件的方法
2017/09/04 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
2020/02/06 PHP
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
JavaScript的类型、值和变量小结
2015/07/09 Javascript
浅谈jquery的html方法里包含特殊字符的处理
2016/11/30 Javascript
Html5+jQuery+CSS制作相册小记录
2016/12/30 Javascript
Vue 拦截器对token过期处理方法
2018/01/23 Javascript
React Hooks的深入理解与使用
2018/11/12 Javascript
Node.js Buffer模块功能及常用方法实例分析
2019/01/05 Javascript
js实现一个页面多个倒计时的3种方法
2019/02/25 Javascript
JS中的防抖与节流及作用详解
2019/04/01 Javascript
JS实现求字符串中出现最多次数的字符和次数示例
2019/07/05 Javascript
[04:02]DOTA2上海特锦赛小组赛第二日recap精彩回顾
2016/02/28 DOTA
[00:12]DAC2018 Miracle-站上中单舞台,他能否再写奇迹?
2018/04/06 DOTA
使用Python获取Linux系统的各种信息
2014/07/10 Python
Python的批量远程管理和部署工具Fabric用法实例
2015/01/23 Python
python+matplotlib演示电偶极子实例代码
2018/01/12 Python
详解python中的线程
2018/02/10 Python
使用python和pygame绘制繁花曲线的方法
2018/02/24 Python
Django 静态文件配置过程详解
2019/07/23 Python
在pycharm中debug 实时查看数据操作(交互式)
2020/06/09 Python
检测用户浏览器是否支持CSS3的方法
2009/08/29 HTML / CSS
使用CSS3实现圆角,阴影,透明
2014/12/23 HTML / CSS
大女孩胸罩:Big Girls Bras
2016/12/15 全球购物
司机岗位职责
2013/11/15 职场文书
市场营销专业大学生职业生涯规划文
2014/03/06 职场文书
2014年医德医风工作总结
2014/11/13 职场文书
2015年保险公司内勤工作总结
2015/05/23 职场文书
小型婚礼主持词
2015/06/30 职场文书
女方家长婚礼致辞
2015/07/27 职场文书
董事长致辞
2015/07/29 职场文书
中学生运动会广播稿
2015/08/19 职场文书
Python制作动态字符画的源码
2021/08/04 Python