排名前10的ES6特性之模块【Modules】

Ranking(2)  Modules

本章节讲述在ES6中如何构建Modules

1、开始。

在ECMAScript 6中,modules 是存储在文件中,一般而言是一个文件一个模块。
有两种方式将模块中的方法暴露给外部使用

1.1 Multiple named exports

//多个暴露的方法或者属性

//------ lib.js ------
export const sqrt = Math.sqrt;
export function square(x) {
    return x * x;
}
export function diag(x, y) {
    return sqrt(square(x) + square(y));
}

说明:
const 声明创建一个只读的常量。这不意味着常量指向的值不可变,而是变量标识符的值只能赋值一次;
详询:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/const
let声明了一个块级域的本地变量,并且可以同时初始化该变量;
let 允许把变量的作用域限制在块级域中。
与 var 不同处是:var 申明变量要么是全局的,要么是函数级的,而无法是块级的。
详细参考请 详询:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/let

//------ main.js ------
import { square, diag } from ‘lib‘;
console.log(square(11)); // 121
console.log(diag(4, 3)); // 5

你也可以引入整个模块:

//------ main.js ------
import * as lib from ‘lib‘;
console.log(lib.square(11)); // 121
console.log(lib.diag(4, 3)); // 5

1.2 Single default export

有如下两种方式

//------ myFunc.js ------
export default function () { ··· } // 

//------ main1.js ------
import myFunc from ‘myFunc‘;
myFunc();

或是定义一个类 class:

//------ MyClass.js ------
export default class { ··· } //

//------ main2.js ------
import MyClass from ‘MyClass‘;
let inst = new MyClass();

1.3 Browsers: scripts versus modules

Scripts             Modules
HTML element   <script>     <script type="module">

2 Modules in JavaScript

2.1 ECMAScript 5 module systems

代表有AMD CMD 方式,这里就不再细说。
对于COMMOM js 上述例子的表现形式如下:

    //------ lib.js ------
    var sqrt = Math.sqrt;
    function square(x) {
        return x * x;
    }
    function diag(x, y) {
        return sqrt(square(x) + square(y));
    }
    module.exports = {
        sqrt: sqrt,
        square: square,
        diag: diag,
    };

    //------ main.js ------
    var square = require(‘lib‘).square;
    var diag = require(‘lib‘).diag;
    console.log(square(11)); // 121
    console.log(diag(4, 3)); // 5

2.2 ECMAScript 6 module systems

ES6 模块加载兼容CMD AMD 的优势。
另外,ES6 模块语法比commonJS 更加严格
基于 promise的module loader,接收单个模块模型

System.import(‘some_module‘)
    .then(some_module => {
        // Use some_module
    })
    .catch(error => {
        ···
    });

也可以接收多个模块,使用 Promise.all()

Promise.all(
        [‘module1‘, ‘module2‘, ‘module3‘]
        .map(x => System.import(x)))
    .then(([module1, module2, module3]) => {
        // Use module1, module2, module3
    });

2.3 More loader methods

ES6 loader 拥有更多的load 方法,其中最为重要的是以下3个 System.module(source, options?)
//evaluates the JavaScript code in source to a module (which is delivered asynchronously via a Promise).
System.set(name, module)
//is for registering a module (e.g. one you have created via System.module()).
System.define(name, source, options?)
//both evaluates the module code in source and registers the result.

2.4 细节讲述

讲述 CommonJS vs ES6:

In CommonJS, imports 只是export的备份.
In ES6, imports 是只读read-only 类型.
下面通过demo说明

2.4.1 IN COMMONJS

//------ lib.js ------
var counter = 3;
function incCounter() {
    counter++;
}
module.exports = {
    counter: counter, // (A)
    incCounter: incCounter,
};

//------ main1.js ------
var counter = require(‘./lib‘).counter; // (B)
var incCounter = require(‘./lib‘).incCounter;

// The imported value is a (disconnected) copy of a copy
console.log(counter); // 3
incCounter();//
console.log(counter); // 3

// The imported value can be changed
counter++;
console.log(counter); // 4

另外一种表现形式也无法改变

//------ main2.js ------
var lib = require(‘./lib‘);

// The imported value is a (disconnected) copy
console.log(lib.counter); // 3
lib.incCounter();
console.log(lib.counter); // 3

// The imported value can be changed
lib.counter++;
console.log(lib.counter); // 4

2.4.2  In ES6

//------ lib.js ------
export let counter = 3;
export function incCounter() {
    counter++;
}

//------ main1.js ------
import { counter, incCounter } from ‘./lib‘;

// The imported value `counter` is live
console.log(counter); // 3
incCounter();
console.log(counter); // 4

// The imported value can’t be changed
counter++; // TypeError
If you import the module object via the asterisk (*), you get the same results:

//------ main2.js ------
import * as lib from ‘./lib‘;

// The imported value `counter` is live
console.log(lib.counter); // 3
lib.incCounter();
console.log(lib.counter); // 4

// The imported value can’t be changed
lib.counter++; // TypeError

再来看一例子 ,你不能改变imports ,但是可以改变它的属性方法

//------ lib.js ------
export let obj = {};

//------ main.js ------
import { obj } from ‘./lib‘;

obj.prop = 123; // OK
obj = {}; // TypeError

下一节 讨论 Destructuring.

时间: 2024-08-16 01:25:55

排名前10的ES6特性之模块【Modules】的相关文章

统计电影票房排名前10的电影并存入另一个文件

今天看到一个笔试题,是这样的:给定一个文件(m.dat),里面保存了各个电影票房统计,格式如下: <2012>                                索尼                $769.7 <哈利波特与死亡圣器(上)>              华纳兄弟            $952.0 <星球大战>                            二十世纪福克斯      $775.4 <怪物史莱克4>      

编程面试中排名前10的算法

以下是在编程面试中排名前10的算法相关的概念,我会通过一些简单的例子来阐述这些概念.由于完全掌握这些概念需要更多的努力,因此这份列表只是作为一个介绍.本文将从Java的角度看问题,包含下面的这些概念: 1. 字符串 如果IDE没有代码自动补全功能,所以你应该记住下面的这些方法. toCharArray() // 获得字符串对应的char数组 Arrays.sort() // 数组排序 Arrays.toString(char[] a) // 数组转成字符串 charAt(int x) // 获得

2014年市场需求排名前10的编程语言 - 生命的延续是 BI

开篇介绍 2014年就快收尾了,Team 内部每人都会准备一些 Tech Talk 的内容,技术方面的,咨询方面的都可以.我就准备了一些有关 BI 排名,BI 报表排名,包括各种技术编程语言等相关排名的信息.摘选一部分有关编程技术相关的拿出来分享给大家看一下,或许对大家年终写写总结,内部技术分享时有所帮助. 以社交与工作需求相关角度出发的 2014 TOP 10 排名 来自 Slideshare 上的一个分享 - http://fr.slideshare.net/lyndadotcom/top-

【翻译】在GitHub上通过星级评估排名前10的最受欢迎的开源Delphi项目

GitHub上有相当多的Delphi开源项目可以为你节省一些时间.我在GitHub上搜索了Delphi,然后按最主要的项目进行排序,并列出了前十名单.这里有一些非常好的东西,包括Awesome Delphi(这是另一个顶级列表),Delphi IDE颜色主题项目,MVC Web框架,REST API客户端,Delphi开源计算机视觉库标题,一个非常强大的自定义TreeView组件,单元测试框架,将Chrome嵌入到您的应用中的组件,以及最终的OmniThreadLibrary. 查看下面的完整列

【转】GitHub 排名前 100 的安卓、iOS项目简介

GitHub Android Libraries Top 100 简介 排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android 不相关的项目, 所以排名并不具备任何官方效力, 仅供参考学习, 方便初学者快速了解当前一些流行的 Android 开源库. 项目名称 项目简介 1. react-native 这 个是 Facebook 在 React.js Conf 2015 大会上推出的基于 JavaScript 的开源框架 Re

2016年GitHub 排名前 100 的安卓、iOS项目简介(收藏)

排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android 不相关的项目, 所以排名并不具备任何官方效力, 仅供参考学习, 方便初学者快速了解当前一些流行的 Android 开源库. 项目名称 项目简介 1. react-native 这个是 Facebook 在 React.js Conf 2015 大会上推出的基于 JavaScript 的开源框架 React Native, 该框架结合了 Web 应用和 Native 应用的

GitHub 排名前 100 的安卓、iOS项目简介

GitHub Android Libraries Top 100 简介 转自:http://www.devstore.cn/essay/essayInfo/6485.html 排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android 不相关的项目, 所以排名并不具备任何官方效力, 仅供参考学习, 方便初学者快速了解当前一些流行的 Android 开源库. 项目名称 项目简介 1. react-native 这个是 Faceboo

GitHub 上排名前 100 的 IOS 开源库简介

主要对当前 GitHub 排名前 100 的项目做一个简单的简介, 方便初学者快速了解到当前 Objective-C 在 GitHub 的情况. 项目名称 项目信息 1. AFNetworking 作者是 NSHipster 的博主, iOS 开发界的大神级人物, 毕业于卡内基·梅隆大学, 开源了许多牛逼的项目, 这个便是其中之一, AFNetworking 采用 NSURLConnection + NSOperation, 主要方便与服务端 API 进行数据交换, 操作简单, 功能强大, 现在

2016年GitHub排名前20的Python机器学习开源项目(转)

当今时代,开源是创新和技术快速发展的核心.本文来自 KDnuggets 的年度盘点,介绍了 2016 年排名前 20 的 Python 机器学习开源项目,在介绍的同时也会做一些有趣的分析以及谈一谈它们的发展趋势.和去年一样,KDnuggets 介绍了 GitHub 上最新的并且排名前 20 的 Python 机器学习开源项目.令人吃惊的是,去年一些最活跃的项目已经停滞不前了,也有一些项目跌出了前 20 名(在 contribution 和 commit 方面),当然,也有 13 个新项目进入了前