ES6模块不是对象,而是经过export命令显式指定输出的代码,输入时也采用静态命令的形式。html
ES6的模块自动采用严格模式node
export命令用于规定模块的对外接口,import命令用于输入其余模块提供的功能。es6
//直接导出 export var year = 1958; //导出变量 export function multiply(x, y) { //导出函数 return x * y; }; //导出一组变量(属性,方法) var firstName = 'Michael'; var lastName = 'Jackson'; var year = 1958; export {firstName, lastName, year}; //导出而且重命名 function v1() { ... } function v2() { ... } //即便重命名了,原来的也能够用,至关于加了别名 export { v1 as streamV1, //重命名了 v2 as streamV2, v2 as streamLatestVersion //重命名两次 }; //混合导出,既定义了默认的,也定义了不默认的 export default class Client{ } export const foo = 'bar'; //使用的时候能够分别导入 import Client,{foo} from 'module'; //暴露一个模块的全部接口 export * from 'module'; //连锁导出 //a.js,导出一个函数 export function foo(){} //b.js,b模块导出全部内容,而这些内容来自a模块 export * from 'a'; //app.js,那么在使用的时候 import { foo } from 'b'; //暴露一个模块的部分接口 export { test } from 'module'; //暴露一个模块的默认接口 export { default } from 'module';
一个模块就是一个独立的文件。该文件内部的全部变量,外部没法获取。若是你但愿外部可以读取模块内部的某个变量,就必须使用 export 关键字输出该变量。babel
export命令能够出如今模块的任何位置,只要处于模块顶层就能够。若是处于块级做用域内,就会报错app
一个模块只能有一个默认输出,所以export default命令只能使用一次函数
export * 命令会忽略模块的default方法学习
//直接导入,而且输入到不一样的变量里面,这些变量名须要跟导入源一致 import {firstName, lastName, year} from './profile'; //导入以后就能够直接使用了 function setName(element) { element.textContent = firstName + ' ' + lastName; } //直接导入,不过没有写路径 import {myMethod} from 'util'; //直接导入并重命名,主要是为了方便 import { lastName as surname } from './profile'; //不引入接口,仅运行模块代码 import 'XXXmodule' //由于default是关键字,导入的时候不能直接使用,须要改一下名字,用as改 import { default as xxx } from 'modules'; //至关于,xxx是一个新的名字,可以代替导入模块 import xxx from 'module' //以lodash模块举例,他的default是_,非default有一个each接口,能够同时导入 import _, { each } from 'lodash';
import命令具备提高效果,会提高到整个模块的头部测试
import后面的from指定模块文件的位置,能够是相对路径,也能够是绝对路径,.js路径能够省略。若是只是模块名,不带有路径,那么必须有配置文件,告诉 JavaScript 引擎该模块的位置。url
import是静态执行,也是编译前执行的,因此不能使用表达式和变量,这些只有在运行时才能获得结果的语法结构。code
屡次执行同一个import的话,只会执行一次
import 不能导入*,要用as更名
若是在一个模块之中,先输入后输出同一个模块,import语句能够与export语句写在一块儿。
export { es6 as default } from './someModule'; // 等同于 import { es6 } from './someModule'; export default es6;
// circleplus.js //* 导出circle的全部,可是会忽略default export * from 'circle'; export var e = 2.71828182846; //自定义了一个e变量导出 export default function(x) { //自定义了一个default导出,由于 * 忽略了default,若是须要导出的话,须要本身补一个 return Math.exp(x); } // main.js //导入了circleplus模块的全部,不过* 同样会忽略了default import * as math from 'circleplus'; //将circleplus所有导入并更名为math import exp from 'circleplus'; //导入了circleplus的default //exp就是导入的默认default 函数 console.log(exp(math.e)); //math就是circleplus,因此能够调用变量e
const声明的常量只在当前代码块有效。若是想设置跨模块的常量(即跨多个文件),或者说一个值要被多个模块共享,能够采用下面的写法。
// constants.js 模块 export const A = 1; export const B = 3; export const C = 4; // test1.js 模块 import * as constants from './constants'; //经过导入模块来共享 console.log(constants.A); // 1 console.log(constants.B); // 3 // test2.js 模块 import {A, B} from './constants'; console.log(A); // 1 console.log(B); // 3
若是要使用的常量很是多,能够建一个专门的constants目录,将各类常量写在不一样的文件里面,保存在该目录下。
// constants/db.js export const db = { url: 'http://my.couchdbserver.local:5984', admin_username: 'admin', admin_password: 'admin password' }; // constants/user.js export const users = ['root', 'admin', 'staff', 'ceo', 'chief', 'moderator']; 而后,将这些文件输出的常量,合并在index.js里面。 // constants/index.js export {db} from './db'; //使用一个中转模块(文件)来收集这些常量模块 export {users} from './users'; 使用的时候,直接加载index.js就能够了。 // script.js import {db, users} from './constants';
须要注意的是,单纯es6语法并不能很简单的测试,须要使用babel-node这样的支持彻底的es6语法的解析器才能解析,详情能够参考一下:(http://es6.ruanyifeng.com/#do...
参考引用:
ranyifeng的es6入门 我是买了实体书而后再看电子版的