ES6模块加载export 、import、export default 、import() 语法与区别
在 ES6 之前,社区制定了一些模块加载方案,最主要的有 CommonJS 和 AMD 两种。
CommonJS 用于服务器,AMD 用于浏览器。
ES6 在语言标准层面上,实现了模块功能,而且简单,完全可以取代 CommonJS 和 AMD 规范,成为浏览器和服务器通用的模块解决方案。

ES6 的模块自动采用严格模式,不管你有没有在模块头部加上"use strict";。
严格模式主要有以下限制。
变量必须声明后再使用
函数的参数不能有同名属性,否则报错
不能使用with语句
不能对只读属性赋值,否则报错
不能使用前缀 0 表示八进制数,否则报错
不能删除不可删除的属性,否则报错
不能删除变量delete prop,会报错,只能删除属性delete global[prop]
eval不会在它的外层作用域引入变量
eval和arguments不能被重新赋值
arguments不会自动反映函数参数的变化
不能使用arguments.callee
不能使用arguments.caller
禁止this指向全局对象
不能使用fn.caller和fn.arguments获取函数调用的堆栈
增加了保留字(比如protected、static和interface)
上面这些限制,模块都必须遵守。由于严格模式是 ES5 引入的,不属于 ES6,所以请参阅相关 ES5 书籍。

其中,尤其需要注意this的限制。ES6 模块之中,顶层的this指向undefined,即不应该在顶层代码使用this。

//index.js
//export 命令var a = 'a';var b = 'b';var c = 'c';//命令规定的是对外的接口,必须与模块内部的变量建立一一对应关系。用大括号export {a,b,c}export var d = 'd';export {d}export function f(){}export {f}//报错export 1;// 报错var m = 1;export m;// 报错function f() {}export f;
--------------------------------------------------------------------------------------------//export重命名语句 原命名 as 新命名export {a as m,b as n}
--------------------------------------------------------------------------------------------//export语句输出的接口,与其对应的值是动态绑定关系,即通过该接口,可以取到模块内部实时的值。//输出变量foo,值为bar,500 毫秒之后变成baz。//这一点与 CommonJS 规范完全不同。CommonJS 模块输出的是值的缓存,不存在动态更新export var foo = 'bar';setTimeout(() => foo = 'baz', 500);
--------------------------------------------------------------------------------------------//export命令可以在模块的任何位置,必须处于模块顶层,如果在块级作用域没法静态化会报错。//报错function foo() {export default 'bar' }foo()
//main.js
//import命令import {a} from 'index.js';import {b} from 'index.js';import {c} from 'index.js';//等同于import {a,b,c} from 'index';//以上两种写法相同,import语句是独生模式
--------------------------------------------------------------------------------------------import {a} from 'index';//报错 变量a是只读的,可以改写a的属性var a = '1';//合法操作,但是其他模块输入读到改写后的值,不推荐使用难以查错,可用于特殊场景路由控制等等var a.foo = 'ok';
--------------------------------------------------------------------------------------------//import 有提升效果,会提升到模块头部执行foo();import { foo } from 'my_module';//ok
--------------------------------------------------------------------------------------------//import 是静态执行,不可以用变量和表达式,不能使用这些只有在运行时才能得到结果的语法结构。// 报错import { 'f' + 'oo' } from 'my_module';// 报错let module = 'my_module';import { foo } from module;// 报错if (x === 1) {import { foo } from 'module1';} else {import { foo } from 'module2';}
//模块使用整体加载//circle.jsexport function area(radius) {return Math.PI * radius * radius;}export function circumference(radius) {return 2 * Math.PI * radius;}//index.js//逐一加载下面写法import { area, circumference } from './circle';console.log('圆面积:' + area(4));console.log('圆周长:' + circumference(14));//使用整体加载,即用星号(*)指定一个对象,所有输出值都加载在这个对象上面。import * as circle from './circle';console.log('圆面积:' + circle.area(4));console.log('圆周长:' + circle.circumference(14));
//export default 命令//方便加载,import命令可以为该匿名函数指定任意名字。// export-default.jsexport default function () {console.log('foo');}// import-default.jsimport customer from './export-default';customer(); // 'foo'
--------------------------------------------------------------------------------------------//对应的import语句不需要使用大括号import customName from './index';customName(); // 'foo'//两种写法export default function () {console.log('foo');}//或者写成function foo() {console.log('foo');}export default foo;
--------------------------------------------------------------------------------------------//export default 就是输出一个叫做default的变量或方法// 正确export var a = 1;// 正确var a = 1;export default a;// 错误export default var a = 1;//export default命令输出变量时,本质是将后面值,赋给default变量,所以可以直接将一个值写在export default之后// 正确export default 42;// 报错export 42;
--------------------------------------------------------------------------------------------//export default 允许用 as 任意命名,重命名为 default 有效function add(x, y) {return x * y;}export {add as default};// 等同于export default add;//main.js 引用import { default as add } from './index';//等同于import add from './index';
--------------------------------------------------------------------------------------------//有了export default命令,import 可以同时输入默认方法和其他接口//moudle.jsexport default function (obj) {}export function each(obj, iterator, context) {}export { each as forEach };//index.jsimport a, { each, forEach } form 'moudle';
--------------------------------------------------------------------------------------------//export default也可以用来输出类// MyClass.jsexport default class {}// main.jsimport MyClass from 'MyClass';let o = new MyClass();
//import 和 export 复合写法//export和import语句可以结合写成一行。相当于对外转发了接口,导致当前模块不能直接使用foo和bar。export { foo, bar } from 'my_module';// 可以简单理解为import { foo, bar } from 'my_module';export { foo, bar };
--------------------------------------------------------------------------------------------//模块的接口改名和整体输出,也可以采用这种写法。// 接口改名export { foo as myFoo } from 'my_module';// 整体输出export * from 'my_module';
--------------------------------------------------------------------------------------------//默认接口的写法如下。export { default } from 'foo';
--------------------------------------------------------------------------------------------//具名接口改为默认接口的写法如下。export { es6 as default } from './someModule';// 等同于import { es6 } from './someModule';export default es6;
--------------------------------------------------------------------------------------------//默认接口也可以改名为具名接口。export { default as es6 } from './someModule';
--------------------------------------------------------------------------------------------//注意下面三种import语句,没有对应的复合写法。为了做到形式的对称,现在有提案。import * as someIdentifier from "someModule";//*号重命名整体加载import someIdentifier from "someModule";//默认接口重命名import someIdentifier, { namedIdentifier } from "someModule";//同时输入默认方法和其他接口
//模块继承//circleplus模块 继承 circle模块。// circle.jsexport function area(radius) {return Math.PI * radius * radius;}export function circumference(radius) {return 2 * Math.PI * radius;}export default function(){}// circleplus.js//这里是复合写法,export *,表示再输出circle模块所有属性和方法。注意,export *命令会忽略circle模块的default方法。然后,上面代码又输出了自定义的e变量和默认方法。export * from 'circle';export var e = 2.71828182846;export default function(x) {return Math.exp(x);}//也可以将circle的属性或方法,改名后再输出。将其改名为circleArea。// circleplus.jsexport { area as circleArea } from 'circle';//加载模块 import exp表示,将circleplus模块的默认方法加载为exp方法。// main.jsimport * as math from 'circleplus';import exp from 'circleplus';console.log(exp(math.e));
//跨模块常量//const声明的常量只在当前代码块有效。建一个专门的constants目录,将各种常量写在不同的文件里面,保存在该目录下。// constants/db.jsexport const db = {url: 'http://my.couchdbserver.local:5984',admin_username: 'admin',admin_password: 'admin password'};// constants/user.jsexport const users = ['root', 'admin', 'staff', 'ceo', 'chief', 'moderator'];//将这些文件输出的常量,合并在index.js里面。// constants/index.jsexport {db} from './db';export {users} from './users';//使用的时候,直接加载index.js就可以了。// script.jsimport {db, users} from './constants/index';

上面的总结,更加清晰明了,细节上还有很多地方需要注意,建议多敲代码,明天再更、、、

ES6 模块加载export 、import、export default 、import() 语法与区别,笔记总结相关推荐

  1. ES6模块加载方案 CommonJS和AMD ES6和CommonJS

    目录 CommonJS CommonJS和AMD的对比 ES6和CommonJS 改成ES6 exports和module.exports CommonJS 每个文件就是一个模块,有自己的作用域.在一 ...

  2. es6 循环加载ES6模块

    循环加载ES6模块 "循环加载"(circular dependency)指的是,a脚本的执行依赖b脚本,而b脚本的执行又依赖a脚本. // a.js var b = requir ...

  3. es6 Node加载

    Node加载 概述 Node 对 ES6模块的处理比较麻烦,因为它有自己的 CommonJS模块格式,与 ES6模块格式是不兼容的.目前的解决方案是,将两者分开,ES6模块和 CommonJS 采用各 ...

  4. Javascript模块加载捆绑器Browserify Webpack和SystemJS用法

    Javascript模块加载捆绑器Browserify Webpack和SystemJS用法 转自 http://www.jdon.com/idea/js/javascript-module-load ...

  5. react 中使用import()实现按需加载报错 解决方法 --‘import’ and ‘export’ may only appear at the top level

    react 中使用import()实现按需加载报错 解决方法 --'import' and 'export' may only appear at the top level 参考文章: (1)rea ...

  6. ES6 系列之模块加载方案

    前言 本篇我们重点介绍以下四种模块加载规范: AMD CMD CommonJS ES6 模块 最后再延伸讲下 Babel 的编译和 webpack 的打包原理. require.js 在了解 AMD ...

  7. 模块加载过程代码分析1

    一.概述 模块是作为ELF对象文件存放在文件系统中的,并通过执行insmod程序链接到内核中.对于每个模块,系统都要分配一个包含以下数据结构的内存区. 一个module对象,表示模块名的一个以null ...

  8. Skywalking-13:Skywalking模块加载机制

    模块加载机制 基本概述 Module 是 Skywalking 在 OAP 提供的一种管理功能特性的机制.通过 Module 机制,可以方便的定义模块,并且可以提供多种实现,在配置文件中任意选择实现. ...

  9. javascript 异步模块加载 简易实现

    在javascript是没有类似java或其他语言的模块概念的,因此也不可能通过import或using等关键字来引用模块,这样造成了复杂项目中前端代码混乱,变量互相影响等. 因此在复杂项目中引入AM ...

最新文章

  1. Spring Cloud构建微服务架构:分布式服务跟踪(抽样收集)【Dalston版】
  2. String案例 获取一个字符串在另一个字符串中出现的次数(两种方法)
  3. Maven搭建简单的SS项目
  4. c语言必背数据结构_数据结构(C语言)考试重点必背
  5. sklearn分类任务代码整理
  6. **踩坑之通用Mapper中 Mapper.selectByExample(example)**的返回
  7. fork 与 vfork
  8. Python:笨方法学 Python3-课程 41 笔记
  9. (转)淘淘商城系列——SSM框架整合之表现层整合
  10. 近年热门细胞研究话题颂通大盘点
  11. P1867 【Mc生存】经验值 java题解
  12. Expected Error Reduction的缺点
  13. 掌握合影拍摄技巧 拍出不一样的全家福
  14. TCP FIN_WAIT2定时器
  15. 迅为4412开发板-实验LEDS驱动一
  16. 自学软件测试真的可以吗?
  17. 淘宝商城推广以及促销项目
  18. 倾角传感器的正确选择
  19. linux 恶意软件检测,两款针对Linux系统Rootkit和恶意软件的有用检测工具
  20. 怎么调用t-tide

热门文章

  1. crt查看开机日志_电脑开机要几分钟?这几个关键的设置你肯定没有做好
  2. 在html游戏里添加计时,如何在计时器上运行后台任务 (HTML)
  3. bootstrap项目实例_精选开源SpringBoot项目:涵盖权限、搜索、秒杀、支付!值得学习...
  4. golag mysql_golang连接mysql操作示例增删改查
  5. FPGA设计心得(13)aurora的线速率及其用户时钟之间的关系?
  6. 傅里叶分析中的时频域之间的关系(以及一点对于DFT的一点思考)
  7. ChipScope Pro内核插入器
  8. promise async 学习笔记
  9. 2018-1-8 Linux学习笔记
  10. 2018年计划读书清单