javascript 模块化机制

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类了。
总结下来:

  1. js类库必须在header中引入,保证对以后script引入的js文件的支撑,毕竟script标签的实行递次是递次实行,script标签引入递次和现实引入递次雷同。

  2. 自定义的script标签引入的js文件,要放在body的尾部,保证DOM元素衬着完毕。

  3. 每一个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模块另有以下优点:

  1. 不再须要UMD模块花样了,将来服务器和浏览器都邑支撑ES6模块花样。现在,经由过程种种东西库,实在已做到了这一点。

  2. 将来浏览器的新API就能够用模块花样供应,不再必要做成全局变量或许navigator对象的属性。

  3. 不再须要对象作为定名空间(比方Math对象),将来这些功用能够经由过程模块供应。

浏览器运用ES6模块的语法以下:

导出对象和变量:

variables.js

var firstName = 'XXX';
var lastName = 'YYY';
export {firstName, lastName};

Point.js

// 导出类对象
export default class Point extends circle {

}

引入module


import Point from "Point";

加载机制详见:es6 module

援用材料:
高静:js的并行加载与递次实行

    原文作者:eternalpledge
    原文地址: https://segmentfault.com/a/1190000007399044
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞