個人github github.com/zhuanyongxi…javascript
ES6中export和import通常的用法有兩種php
就是每個須要導出的數據類型都要有一個name,統一引入必定要帶有{}
,即使只有一個須要導出的數據類型。這種寫法清爽直觀,是推薦的寫法。html
//------ lib.js ------
const sqrt = Math.sqrt;
function square(x) {
return x * x;
}
function diag(x, y) {
return sqrt(square(x) + square(y));
}
export {sqrt, square, diag}
//------ main.js ------
import { square, diag } from 'lib';
console.log(square(11)); // 121
console.log(diag(4, 3)); // 5
複製代碼
把export直接加到聲明前面就能夠省略{}
java
//------ 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));
}
//------ main.js ------
import { square, diag } from 'lib';
console.log(square(11)); // 121
console.log(diag(4, 3)); // 5
複製代碼
不管怎樣導出,引入的時候都須要{}
。node
當從不一樣模塊引入的變量名相同的時候git
import {speak} from './cow.js'
import {speak} from './goat.js'
複製代碼
這些寫法顯然會形成混亂es6
正確的方法是這樣的github
import {speak as cowSpeak} from './cow.js'
import {speak as goatSpeak} from './goat.js'
複製代碼
但是,當從每一個模塊須要引入的方法不少的時候,這種寫法就顯得十分的繁瑣、冗長,例如api
import {
speak as cowSpeak,
eat as cowEat,
drink as cowDrink
} from './cow.js'
import {
speak as goatSpeak,
eat as goatEat,
drink as goatDrink
} from './goat.js'
cowSpeak() // moo
cowEat() // cow eats
goatSpeak() // baa
goatDrink() // goat drinks
複製代碼
解決方案就是命名空間引入了bash
import * as cow from './cow.js'
import * as goat from './goat.js'
cow.speak() // moo
goat.speak() // baa
複製代碼
十分的簡潔優雅
默認導出就不須要name了,可是一個js文件中只能有一個export default。
//------ myFunc.js ------
export default function () { ... };
//------ main1.js ------
import myFunc from 'myFunc';
myFunc();
複製代碼
其實這種導出方式能夠當作是命名處處的變種,只不過把命名寫成了default。
雖然export default只能有一個,但也能夠導出多個方法。
export default {
speak () {
return 'moo'
},
eat () {
return 'cow eats'
},
drink () {
return 'cow drinks'
}
}
複製代碼
引入與命名空間引入相似
import cow from './default-cow.js'
import goat from './default-goat.js'
cow.speak() // moo
goat.speak() // baa
複製代碼
若是咱們在編寫模塊的時候使用的導出方法不統一,那麼引入的時候就須要考慮不一樣模塊引入的方式。這種麻煩能夠經過自引用的方法消除。方法以下
import * as myself from './ambidextrous-cow.js' // import this file into itself
// this module's own namespace is its default export export default myself export function speak () { console.log('moo') } 複製代碼
這樣在引入的時候就不須要考慮引入方式了。
import cow from './ambidextrous-cow'
import * as alsocow from './ambidextrous-cow'
cow.speak() // moo
alsocow.speak() // moo
複製代碼
兩種引入方法都可。
這種方法也有一個小缺點,就是在咱們編寫的模塊中,有一個function是經常使用的,咱們想默認導出,可export default
已經使用了,而咱們知道export default
在一個模塊中只能使用一次。這時就要使用Object.assign
import * as myself from './ambidextrous-cow.js'
export default Object.assign(speak, myself)
export function speak () {
console.log('moo')
}
複製代碼
須要注意的是,Object.assign
只能用於function。
對應引入的例子
import cow from './ambidextrous-cow'
import * as alsocow from './ambidextrous-cow'
cow() // moo
cow.speak() // moo
alsocow.speak() // moo
複製代碼
參考文章
1.[es6] import, export, default cheatsheet
2.詳解JavaScript ES6中export import與export default的用法和區別