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 1.0.4 - New Wave Javascript(js源文件)
Jan 15 Javascript
基于javascript编写简单日历
May 02 Javascript
JS实现登录页面记住密码和enter键登录方法推荐
May 10 Javascript
AngularJS表格样式简单设置方法示例
Mar 03 Javascript
原生JS+CSS实现炫酷重力模拟弹跳系统的登录页面
Nov 01 Javascript
JS中原始值和引用值的储存方式示例详解
Mar 23 Javascript
深入浅析AngularJs模版与v-bind
Jul 06 Javascript
微信小程序 调用远程接口 给全局数组赋值代码实例
Aug 13 Javascript
解决layui中onchange失效以及form动态渲染失效的问题
Sep 27 Javascript
JS中的const命令你真懂它吗
Mar 08 Javascript
JS实现进度条动态加载特效
Mar 25 Javascript
Angular处理未可知异常错误的方法详解
Jan 17 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
多数据表共用一个页的新闻发布
2006/10/09 PHP
php下使用以下代码连接并测试
2008/04/09 PHP
php循环检测目录是否存在并创建(循环创建目录)
2011/01/06 PHP
学习php过程中的一些注意点的总结
2013/10/25 PHP
PHP文件生成的图片无法使用CDN缓存的解决方法
2015/06/20 PHP
laravel Model 执行事务的实现
2019/10/10 PHP
javascript 匿名函数的理解(透彻版)
2010/01/28 Javascript
不同的jQuery API来处理不同的浏览器事件
2012/12/09 Javascript
读取input:file的路径并显示本地图片的方法
2013/09/23 Javascript
JS获取DropDownList的value值与text值的示例代码
2014/01/07 Javascript
JavaScript实现简单图片滚动附源码下载
2014/06/17 Javascript
JSON.stringify转换JSON时日期时间不准确的解决方法
2014/08/08 Javascript
js实现图片轮播效果
2015/12/19 Javascript
nodejs 十六进制字符串型数据与btye型数据相互转换
2018/07/30 NodeJs
js常见遍历操作小结
2019/06/06 Javascript
Centos7 安装Node.js10以上版本的方法步骤
2019/10/15 Javascript
Python的加密模块md5、sha、crypt使用实例
2014/09/28 Python
python基于xml parse实现解析cdatasection数据
2014/09/30 Python
详细讲解用Python发送SMTP邮件的教程
2015/04/29 Python
编写Python脚本来获取mp3文件tag信息的教程
2015/05/04 Python
Python编程中的异常处理教程
2015/08/21 Python
Python升级导致yum、pip报错的解决方法
2017/09/06 Python
PyTorch搭建多项式回归模型(三)
2019/05/22 Python
Django实现web端tailf日志文件功能及实例详解
2019/07/28 Python
pyinstaller打包程序exe踩过的坑
2019/11/19 Python
英国经济型酒店品牌:Travelodge
2019/12/17 全球购物
简述网络文件系统NFS,并说明其作用
2016/10/19 面试题
外贸英语毕业生自荐信
2013/11/14 职场文书
营销总经理的岗位职责
2013/12/15 职场文书
数学教学随笔感言
2014/02/17 职场文书
有多年工作经验的自我评价
2014/03/02 职场文书
小学数学教学经验交流材料
2014/05/22 职场文书
优秀电子工程系毕业生求职信
2014/05/24 职场文书
2014年宣传部工作总结
2014/11/12 职场文书
文明单位创建材料
2014/12/24 职场文书
教代会闭幕词
2015/01/28 职场文书