ES6的模块化设计思想是静态化,也就是说,在编译的时候确定模块的依赖关系,以及输出输出入的变量。而CommonJSAMD模块都是在运行时确定的。ES6的模块不是对象,而是通过export显示指定输出的代码,再通过import命令输入。

// 模块输入
import { start,address } from 'util'

上面的模块输入加载了两个方法,即使util模块内有其它方法也不会加载,只会加载上面引入的两个方法,这种加载称为“编译时加载”或静态加载

需要注意的是,ES6的模块自动采取严格模式,不管头部有没有加上"use strict"都会开启严格模式。严格模式的限制如下:

1、变量必须先声明再使用

2、函数参数不能有同名属性,否则报错

3、不能使用with语句

4、不能对只读属性赋值,否则报错

5、不能使用前缀0表示八进制数,否则报错

6、不能删除不可删除的属性,否则报错

7、不能删除变量delete prop,会报错,只能删除属性delete global[prop]

8、eval不会在它的外层作用域引入变量

9、evalarguments不能被重新赋值

10、arguments不会自动反映函数参数的变化

11、不能使用arguments.callee

12、不能使用arguments.caller

13、禁止this指向全局对象

14、不能使用fn.callerfn.arguments获取函数调用的堆栈

15、增加了保留字(比如protectedstaticinterface


export和import命令

模块主要有exportimport构成,export规定模块对外的接口,import用于输入模块提供的功能。

模块导出

// util模块
// 类型
function type(a){
return typeof a
}
// 计算
function sum(a,b) {
return a * b
}
// 判断是否为数组
function isArray(a) {
return a instanceof Array
}
export { type,sum } // 按需导出

模块导入

import {  type,sum } from './util'
let num = sum(10,5)
console.log(num) // 50

上面两种方式是可选的方式导出的,也就是说,import导入模块的时候,只会加载export导出的方法,其它的方法不会被import加载,并且import引入util模块可以按需引入,引入自己需要的模块即可,其它未引入的模块也不会加载,这也就是静态加载的好处。

除了export { xxx,xxx }的按需导出外,ES6还提供了export default的默认导出,默认导出的方法,在import导入的时候,不需要跟导出名一直,可以自定义名称接收导出的方法。

// util模块
// 计算
function sum(a,b) {
return a * b
}
// 判断是否为数组
function isArray(a) {
return a instanceof Array
} export default sum // 默认导出
import aaa from './util'  // 导入时名字可以自定义
let num = aaa(10,5)
console.log(num) // 50

其实这个default就是一个叫做default的变量,这个变量可以被任意命名,在import导入的时候,取任何名称都可以匹配上default导出的方法。

按需和默认导出

export { xxx,xxx }export default默认导出可以同时使用

// util模块
function type(a){
return typeof a
} function sum(a,b) {
return a * b
} function isArray(a) {
return a instanceof Array
} export { type,sum }
export default isArray
// 导入
import { type,sum }from './util'
import aaa from './util'

模块的整体加载

上面的导出方法都是加载模块内对应的方法,模块的整体加载要使用*,也就是加载全部,语法如下

import * as util from './util';
// 在页面中使用
let num = util.sum(10,5)
console.log(num) // 50

这种写法是将模块整体加载,用*指定一个对象,所有输出的值都加载在这个对象上面。通过该对象.方法名来获取对应方法。

需要注意的是,ES6的模块是静态分析的,不允许对模块进行改变,所以下面写法是不允许的:

util.sum = 'hello' // 报错
util.sum = function () {} // 报错

模块继承

模块之间也是可以继承的,假设A模块继承了B模块

// A模块
function sum(a,b) {
return a * b
} function isArray(a) {
return a instanceof Array
} export * from 'B' // 输出B模块的所有属性和方法,忽略模块内的default方法
export { sum }
export default isArray

export * 命令会忽略B模块的default方法,因为A模块内部有自己的default方法。


模块的重命名

// util模块
export { sum as s }
// 页面
import { s } from './util' // 引入命名后的方法

模块按需引入import()

正常情况下import是需要在页面顶层引入的,并且import的引入执行的优先级是最高的,例如:

let s = sum(10,5)
import { sum } from './util'

上面这种写法是允许的,程序会执行import的引入,然后再执行let s = sum(10,5),但这种写法会默认导入模块,并且是在顶层导入。

es6提供了动态导入功能:import(),当程序执行到该语句的时候才会导入,并且是同步执行,import()返回的是一个Promise,所以可以使用then方法和async-await

Promise写法

import('./util.js')
.then(el=>{
console.log(el.t(100)); // number
console.log(el.sum(10,5)); // 50
})

async-await写法

async function getImport(){
let { sum } = await import('./util.js')
console.log(sum(2,8));
}
getImport() // 16

也可以通过解构的方式获取

import('../module/import.js')
.then(({sum})=>{
console.log(sum(20,5)); // 100
})

如果模块是default默认导出,其实default就是一个键名

import('../module/import.js')
.then((e)=>{
console.log(e.default([1,2,3])); // true
})

default也可以通过具名的形式导入(取别名)

import('../module/import.js')
.then(({default : isA})=>{
console.log(isA([1,2,3])); // true
})

import.meta

在使用一个模块时,有时候需要知道该模块本身的信息(比如模块的路径),import命令新增了一个元属性import.meta,可以返回当前模块的信息。

注意import.meta只能在模块内使用,在模块外使用会报错

// util模块
function sum(a,b) {
return a * b
} function getMeta(){
return import.meta // 获取当前模块的元信息
} export { sum,getMeta }
// console.log(import.meta);  // import.meta只能在模块内使用,在模块外部使用会报错
import('./util.js')
.then(el=>{
console.log(el.getMeta()); // {url: 'http://127.0.0.1:5500/module/import.js', resolve: ƒ}
})


案例源码:https://gitee.com/wang_fan_w/es6-science-institute

如果觉得这篇文章对你有帮助,欢迎点亮一下star哟

Module理解及使用的更多相关文章

  1. 对drupal的理解【转】

    写本文是想跟刚用drupal的朋友,分享一下心得,国内用drupal的太少了,希望大家能好好交流. 希望几分钟看完后你能马上上手drupal,至少能理解hook,api,theme,module,cc ...

  2. 图像处理&计算机视觉中upscale,downscale的翻译理解

    最近在看SAN网络(Second-order Attention Network for Single Image Super-Resolution)的论文,其中的Upscale module理解的不 ...

  3. angular.module 详解

    AngularJS 模块 模块包含了主要的应用代码. 一个应用可以包含多个模块,每一个模块都包含了定义具体功能的代码. 可以将module理解成一个容器,可以往其中放入controllers.serv ...

  4. Android Studio使用教程(一)(转)

    今年的Google全球开发者大会虽然没有新的Android系统和设备,但是还是推出了一些不错的产品,Android Studio就是其中之一.这个基于Intellij IDEA开发的Android I ...

  5. Android Studio初步使用教程

    今年的Google全球开发者大会虽然没有新的Android系统和设备,但是还是推出了一些不错的产品,Android Studio就是其中之一.这个基于Intellij IDEA开发的Android I ...

  6. Android Studio使用教程图文详解

    谷歌表示Android Studio 1.0 能让开发者“更快更有生产力”,并认为它可以代替 Eclipse,同时为Eclipse 用户提供迁移步骤.代码自动提示.运行响应速度.都比Eclipse来的 ...

  7. Android Studio使用教程(一)

    今年的Google全球开发者大会虽然没有新的Android系统和设备,但是还是推出了一些不错的产品,Android Studio就是其中之一.这个基于Intellij IDEA开发的Android I ...

  8. 第二章 andrid studio创建项目

    原文 http://blog.csdn.net/zhanghefu/article/details/9326735 第二章 andrid studio创建项目 第二章 andrid studio创建项 ...

  9. [Android Studio] Android Studio使用教程(一)

    转载:http://blog.csdn.net/hyr83960944/article/details/37509113 今年的Google全球开发者 大会虽然没有新的Android系统和设备,但是还 ...

  10. (七)理解angular中的module和injector,即依赖注入

    (七)理解angular中的module和injector,即依赖注入 时间:2014-10-10 01:16:54      阅读:63060      评论:1      收藏:0      [点 ...

随机推荐

  1. phpword 模板文件导出word到服务器 并浏览器下载

    模板文件填充 然后生成新文件 //调用PHPwordrequire_once(ROOTPATH . "inc/vendor/autoload.php"); $phpWord = n ...

  2. kettel

    下载教程:(目前最高版本7.1) 1.网址:https://community.hitachivantara.com/docs/DOC-1009855 2.

  3. PGL图学习之基于GNN模型新冠疫苗任务[系列九]

    PGL图学习之基于GNN模型新冠疫苗任务[系列九] 项目链接:https://aistudio.baidu.com/aistudio/projectdetail/5123296?contributio ...

  4. 04.Javascript学习笔记3

    1.箭头函数 箭头函数是一种更短的函数表达式. const age = birthyear => 2022 - birthyear; console.log(age(2000)) 箭头左边的bi ...

  5. Django聚合函数与分组查询

    目录 一:聚合查询 1.聚合函数作用 2.聚合函数查询关键字: 3.聚合函数 4.聚合函数使用 二:分组查询 1.分组查询 2.返回值 3.分组查询关键字 4.分组查询特点 5总结: 三:分组使用 1 ...

  6. GP之gpbackup备份

    从GP6.0后,使用gpbackup命令来实现备份.但GP里是不自带的,需要自己重新下载并编译和安装. 一.安装 (1)master上go下载并配置profile环境变量 go下载地址 :https: ...

  7. @Data加在子类上,子类无法获取父类的属性

    1.问题描述 我的子类继承父类,并在子类上加了@Data注解.但在程序运行时,输出的结果只有我在子类中定义的属性,父类的属性没有输出. 这是我定义的子类: 这个是子类继承的父类: 这个是输出结果: 可 ...

  8. gitee删除上传到的远程分支的提交记录

    在实际开发中可能也经常会遇到写完代码后提交到远程分支但发现写的提交信息有误,不符合规范.由于自己的gitee账号可能没有修改提交记录的权限.因此最佳的解决方法是,撤销本地分支当前的提交记录,将代码回滚 ...

  9. Pytorch基础-张量基本操作

    一,张量的基本操作 二,维度变换 2.1,squeeze vs unsqueeze 维度增减 2.2,transpose vs permute 维度交换 三,索引切片 3.1,规则索引切片方式 3.2 ...

  10. “It is required that your private key files are NOT accessible by others. This private key will be ignored.”

    Windows Terminal 通过密钥登录远程vps时提示: "It is required that your private key files are NOT accessible ...