1. 程式人生 > >簡明 ES6 模組

簡明 ES6 模組

簡明 ES6 模組

1.什麼是模組

模組就是一段程式碼,這段程式碼可以反覆使用,經常單獨寫成一個檔案,一旦載入會立即執行。

2.匯出

匯出有 2 種方式:命名匯出和預設匯出,分別用關鍵字exportexport default表示

2.1 命名匯出:export 關鍵字

  • 第一種方式:在要匯出的程式碼前加上 export 關鍵字就可以了!
export var foo;
export let foo;
export const foo;
export function myFunc() {}
export function* myGenFunc() {}
export class MyClass {}
  • 第二種方式:將要匯出的物件放在export {}{}
var foo1;
let foo2;
const foo3;
function myFunc() {}
class MyClass {}
export {foo1, foo2, foo3, myFunc, MyClass}

2.2 預設匯出:export default 關鍵字

  • 第一種方式:在要匯出的函式或者類之前加 export default 關鍵字,其中名稱可以省略。這將會使其具有匿名函式和匿名類的功能。
export default function myFunc() {}
export default function () {}

export default function* myGenFunc() {}
export default function* () {}
export default class MyClass {}
export default class {}
export default foo;
export default 'Hello world!';
export default 3 * 7;
export default (function () {});
  • 第二種方式:用export default moduleName關鍵字匯出
=========================
var foo1;
export default foo1;
==========================
let foo2;
export default let foo2;
==========================
export function myFunc() {};
export default myFunc;

注意:使用命名匯出時,一個 js 檔案可以 export 多個模組;但是使用預設匯出時,一個檔案只能有一個模組匯出,或者將會報錯。

2.3 其他

2.3.1 重新命名匯出

export { MY_CONST as FOO, myFunc };
export { foo as default };

2.3.2 從其他模組匯出

`export * from 'src/other_module';`
export { foo as myFoo, bar } from 'src/other_module';
export { default } from 'src/other_module';
export { default as foo } from 'src/other_module';
export { foo as default } from 'src/other_module'

3.匯入

匯入方式 語法 描述
預設匯入 import localName from 'src/my_lib'; -
名稱空間匯入 import * as my_lib from 'src/my_lib'; -
命名匯入 import { name1, name2 } from 'src/my_lib'; -
重新命名匯入 import { name1 as localName1, name2 } from 'src/my_lib'; -
空匯入 import 'src/my_lib'; 僅載入模組,不匯入任何內容
預設匯入+名稱空間 import theDefault, * as my_lib from 'src/my_lib'; -
預設匯入+命名匯入 import theDefault, { name1, name2 } from 'src/my_lib'; -

4.匯出與匯入之家的關聯

  • 使用命名匯出時,應用import {ModuleName}的方式匯入;使用預設匯出時,使用import moduleName的方式匯入,無需加花括號。
  • 匯入的時候,我們可以只匯入我們需要的模組,如以下。
------lib.js-----
export const PI = '3.14'
export let perimeter = radius => {
  console.log('周長:', 2 * PI * radius)
}

-----main.js-----
import {perimeter} from 'lib'
perimeter(1);

5.注意事項

  • 直接使用模組語法在瀏覽器中可能無效,需要 babel 等工具轉為可接受的語法
  • 匯出的 2 種方式 export 和 export default 在一個檔案中最好用一種,儘量少混用
  • 在 ES6 模組中,default 是一個關鍵字,不要使用 default 作為 as 的重新命名名稱
  • import 後,import 的模組將會被提升,放置於當前程式碼的最前端。因此,何處匯入模組並不重要。
  • import 應該是單獨的一條語句,不能在其他語句中執行該語句。以下 example.js 中的操作將導致錯誤。
  • 匯入的只是當初模組的只讀檢視,這意味著操作的模組中的變數都儲存在模組的內部
-----example.js------
if(xxx){
import example from "mock"
}

6.例項

【例項 1】連結資訊

-----mock.js-----
export let linkInfo = [
  {
    name: '百度',
    address: 'baidu.com'
  },
  {
    name: '新浪',
    address: 'sina.com'
  },
  {
    name: '優酷',
    address: 'youku.com'
  }
]

-----main.js-----
import {linkInfo} from "mock"
console.log('連結資訊:',JSON.stringify(linkInfo))

【例項 2】工具類
【。。。待填坑】

【例項 3】介面

-----api.js-----
export default {
  addLink (link) {
    let params = {
      name: link.name,
      address: link.address
    }
    return http
      .post('/link/add', params)
      .then(data => {
        return Promise.resolve(data)
      })
      .catch(e => {
        return Promise.reject(e)
      })
  },
  updateLink (link) {
    let params = {
      id: link.id,
      name: link.name,
      address: link.address
    }
    return http
      .post('/link/update', params)
      .then(data => {
        return Promise.resolve(data)
      })
      .catch(e => {
        return Promise.reject(e)
      })
  },
  getLinkList () {
    let params = {
      currentPage: 1,
      pageSize: 20
    }
    return http
      .post('/link/list', params)
      .then(data => {
        return Promise.resolve(data)
      })
      .catch(e => {
        return Promise.reject(e)
      })
  },
  deleteLink (link) {
    let params = {
      id: link.id
    }
    return http
      .post('/link/delete', params)
      .then(data => {
        return Promise.resolve(data)
      })
      .catch(e => {
        return Promise.reject(e)
      })
  }
}

-----main.js-----
import * as api from "./myLib";
api.addLink(myParams)
   .then(res=>{console.log("well")})
   .catch(e => {console.log(e)});