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 相关文章推荐
jQuery Jcrop插件实现图片选取功能
Nov 23 Javascript
在子窗口中关闭父窗口的一句代码
Oct 21 Javascript
jquery实现ajax提交form表单的方法总结
Mar 03 Javascript
AngularJS iframe跨域打开内容时报错误的解决办法
Jan 26 Javascript
浅析Node.js中使用依赖注入的相关问题及解决方法
Jun 24 Javascript
javascript实现label标签跳出循环操作
Mar 06 Javascript
vue-router路由懒加载和权限控制详解
Dec 13 Javascript
Vue自定义过滤器格式化数字三位加一逗号实现代码
Mar 23 Javascript
微信小程序排坑指南详解
May 23 Javascript
vue2.0 自定义组件的方法(vue组件的封装)
Jun 05 Javascript
一步步教你利用Docker设置Node.js
Nov 20 Javascript
微信小程序页面间值传递的两种方法
Nov 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
PHP6 中可能会出现的新特性预览
2014/04/04 PHP
php数组索引与键值操作技巧实例分析
2015/06/24 PHP
PHP中ltrim与rtrim去除左右空格及特殊字符实例
2016/01/07 PHP
弹出广告特效代码(一个IP只弹出一次)
2007/05/11 Javascript
js树形控件脚本代码
2008/07/24 Javascript
JavaScript 核心参考教程 内置对象
2009/10/13 Javascript
IE和firefox浏览器的event事件兼容性汇总
2009/12/06 Javascript
jQuery Flash/MP3/Video多媒体插件
2010/01/18 Javascript
Ext JS 4实现带week(星期)的日期选择控件(实战一)
2013/08/21 Javascript
js获取URL的参数的方法(getQueryString)示例
2013/09/29 Javascript
js动态添加onclick事件可传参数与不传参数
2014/07/29 Javascript
简介JavaScript中用于处理正切的Math.tan()方法
2015/06/15 Javascript
无需 Flash 使用 jQuery 复制文字到剪贴板
2016/04/26 Javascript
详谈JS中实现种子随机数及作用
2016/07/19 Javascript
EasyUI 中combotree 默认不能选择父节点的实现方法
2016/11/07 Javascript
使用JS 插件qrcode.js生成二维码功能
2017/02/20 Javascript
node.js+jQuery实现用户登录注册AJAX交互
2017/04/28 jQuery
vue使用axios实现文件上传进度的实时更新详解
2017/12/20 Javascript
深入浅析JSONAPI在PHP中的应用
2017/12/24 Javascript
页面内锚点定位及跳转方法总结(推荐)
2019/04/24 Javascript
Vue最新防抖方案(必看篇)
2019/10/30 Javascript
vue 实现一个简单的全局调用弹窗案例
2020/09/10 Javascript
Python中将字典转换为XML以及相关的命名空间解析
2015/10/15 Python
Linux下为不同版本python安装第三方库
2016/08/31 Python
python自动化测试之如何解析excel文件
2019/06/27 Python
Django Rest framework解析器和渲染器详解
2019/07/25 Python
Python DataFrame一列拆成多列以及一行拆成多行
2019/08/06 Python
LivingSocial英国:英国本地优惠
2019/02/22 全球购物
2014年预备党员学习两会心得体会
2014/03/17 职场文书
2014年重阳节老干部座谈会上的讲话稿
2014/09/25 职场文书
个人对照检查材料思想汇报
2014/09/26 职场文书
信用卡催款律师函
2015/05/27 职场文书
Redis如何实现分布式锁
2021/08/23 Redis
MySQL中优化SQL语句的方法(show status、explain分析服务器状态信息)
2022/04/09 MySQL
mysql5.5中文乱码问题解决的有用方法
2022/05/30 MySQL
前端与RabbitMQ实时消息推送未读消息小红点实现示例
2022/07/23 Java/Android