ES6
导出
声明时导出
1 2 3 4 5 6 7 8 9 10 11 12
| export let months = ['Jan', 'Feb', 'Mar','Apr', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
export const MODULES_BECAME_STANDARD_YEAR = 2015;
export class User { constructor(name) { this.name = name; } }
|
注意导出函数后面没有分号
单独导出
1 2 3 4 5 6 7 8 9
| function sayHi(user) { alert(`Hello, ${user}!`); } function sayBye(user) { alert(`Bye, ${user}!`); }
export {sayHi, sayBye};
|
导出为(export as)
as
起别名,同导出一样
1 2 3
| ... export {sayHi as hi, sayBye as bye};
|
导入
一般导入
1 2 3 4 5
| import {sayHi, sayBye} from './say.js';
sayHi('John'); sayBye('John');
|
导入所有(import *)
1 2 3 4 5
| import * as say from './say.js';
say.sayHi('John'); say.sayBye('John');
|
明确列出我们需要导入的内容
- 现在的构建工具(webpack 或者其他的)把模块打包到一起,然后对其进行优化以获得更快的加载速度,并且还会删除无用的代码。
- 明确列出要导入的内容会使得名称较短:sayHi() 取代 lib.sayHi()。
- 显示导入可以更好的概述代码结构:在哪里使用了什么。它使得代码阅读和重构更容易。
导入为(import as)
as
起别名
1 2 3 4 5
| import {sayHi as hi, sayBye as bye} from './say.js';
hi('John'); bye('John');
|
默认导出(export default)
默认导出只能有一个,导入时没有括号:
1 2 3 4 5 6 7 8 9 10 11 12
| export default class User { constructor(name) { this.name = name; } }
import User from './user.js'; new User('John');
|
export default
可以没有名字,因为每个文件只有一个export default
。而export
不行,省略命名会出错:
1 2 3 4 5 6 7 8 9 10
| export default class { constructor() { ... } }
export default function(user) { alert(`Hello, ${user}!`); }
export default ['Jan', 'Feb', 'Mar','Apr', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
|
先定义再导出export default
:
1 2 3 4 5
| function sayHi(user) { alert(`Hello, ${user}!`); }
export {sayHi as default};
|
export default
可以和export
一起用(少见):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| export default class User { constructor(name) { this.name = name; } } export function sayHi(user) { alert(`Hello, ${user}!`); }
import {default as User, sayHi} from './user.js'; new User('John');
|
要把 *
作为对象导入,那么 default
属性就是默认导出:
1 2 3 4
| import * as user from './user.js'; let User = user.default; new User('John');
|
谨慎使用 export default
Re-export
1 2
| export {sayHi} from './say.js'; export {default as User} from './user.js';
|
直接导出同时导入的内容,一般用于包管理
跨域问题
Chromium浏览器本地文件导入会有跨域问题,需要安装一个VSCode插件: Live Server
参考:
完全弄懂JavaScript模块化(导出和导入) - 知乎