---
# System prepended metadata

title: import require
tags: [javaScript]

---

# import require
觀念網站
https://hacks.mozilla.org/2015/08/es6-in-depth-modules/

大概流程圖
![](https://i.imgur.com/5bS22qL.png)

備忘錄
https://www.samanthaming.com/tidbits/79-module-cheatsheet/

## 簡單介紹

nood.js很常用這個
模組化概念

**一開始使用**
**CommonJs 和 require**
後來

**ES6**
使用
**ESM 和 import **
但記得這要babel把它編譯回去，不然有些瀏覽器不支援

## 注意事項
 script要寫type="module"
 才能匯入匯出
 
 ex 
 `<script type="module">
 </script>`


## 匯出 匯入 


### 預設匯出
**常見匯出方式，用於匯出物件，在Vue裡面匯出元件**
export defalu {
    data:[],
    init(),
}
### 預設匯入
預設匯出沒有名字，所以可以幫他命名
import a from './c.js'



### 具名匯出
可用於匯出以定義的變數、物件、涵式、專案開發中常用於"方法匯出"
第三方框架、涵式、套件、很常用到具名定義"方法"
export任何頂層function(可以放參數)，class，var，let，或const。
```
// kittydar.js - Find the locations of all the cats in an image.
// (Heather Arthur wrote this library for real)
// (but she didn't use modules, because it was 2013)

export function detectCats(canvas, options) {
  var kittydar = new Kittydar(options);
  return kittydar.detectCats(canvas);
}

export class Kittydar {
  ... several methods doing image processing ...
}

// This helper function isn't exported.
function resizeCanvas() {
  ...
}
...
```

### 具名匯入
用單一匯入 不要用全部匯入
可用於

**單一匯入**
import {} from './c.js'

**全部匯入**
import * as  all from './c.js'


### SideEffect匯入
import './asdasd.js'

老舊套件會用到
ex JQery

## 重命名導入和導出

import {flip as flipOmelet} from "eggs.js";


## 基本觀念
基本概念
require用於讀取並執行js文件， 並返回該模塊的exports對象， 若無指定模塊， 會報錯 所以要.default。

如果一个模块中仅仅export default， 那么就不用加.default了。如果除此之外还有别的对象被 export 出来，那不好意思，只能老老实实写default 了。

Node使用CommonJS模塊規範， CommonJS規範加載模塊是同步的， 只有加載完成， 才能執行後續操作。

import用於引入外部模塊， 其他腳本等的函數， 對象或者基本類型。
import屬於ES6的命令， 它和require不一樣， 它會生成外部模塊的引用而不是加載模塊， 等到真正使用到該模塊的時候才會去加載模塊中的值。

## 比較
import静态编译，import的地址不能通过计算

require就可以，例如 const url = "a" + "b";

Import url 直接报错了

require(url)不会报错

所以require都会用在动态加载的时候

## require

require： 函數，用於導入模塊

module.exports： 變量，用於導出模塊

## import

import: 導入

export： 導出

### 介紹

ES6 模塊是一個包含 JS 代碼的文件。沒有特殊的module關鍵字；一個模塊通常讀起來就像一個腳本。有兩個區別。

ES6 模塊自動是嚴格模式代碼，即使您沒有"use strict";在其中編寫代碼。

您可以在模塊中使用import和export。

讓我們export先談談。默認情況下，模塊內聲明的所有內容都是模塊本地的。如果您希望模塊中聲明的某些內容是公共的，以便其他模塊可以使用它，則必須導出該功能。有幾種方法可以做到這一點。最簡單的方法是添加export關鍵字。

```
// kittydar.js - Find the locations of all the cats in an image.
// (Heather Arthur wrote this library for real)
// (but she didn't use modules, because it was 2013)

export function detectCats(canvas, options) {
  var kittydar = new Kittydar(options);
  return kittydar.detectCats(canvas);
}

export class Kittydar {
  ... several methods doing image processing ...
}

// This helper function isn't exported.
function resizeCanvas() {
  ...
}
...
```

你可以export任何頂層function，class，var，let，或const。

這就是編寫模塊所需要知道的全部內容！您不必將所有內容都放在IIFE或回調中。繼續並聲明您需要的一切。由於代碼是一個模塊，而不是一個腳本，所有的聲明都將作用於該模塊，而不是在所有腳本和模塊中全局可見。導出構成模塊公共 API 的聲明，就大功告成了。

除了導出，模塊中的代碼幾乎就是普通代碼。它可以使用像Object和這樣的全局變量Array。如果您的模塊在 Web 瀏覽器中運行，則它可以使用document和XMLHttpRequest。

在一個單獨的文件中，我們可以導入和使用該detectCats()函數：

```
// demo.js - Kittydar demo program

import {detectCats} from "kittydar.js";

function go() {
    var canvas = document.getElementById("catpix");
    var cats = detectCats(canvas);
    drawRectangles(canvas, cats);
}
```
要從一個模塊導入多個名稱，您可以編寫：

```

import {detectCats, Kittydar} from "kittydar.js";
```

當您運行包含import聲明的模塊時，首先加載它導入的模塊，然後在依賴圖的深度優先遍歷中執行每個模塊主體，通過跳過任何已執行的內容來避免循環。

這些是模塊的基礎知識。這真的很簡單。;-)


### 導出列表

```
export {detectCats, Kittydar};

// no `export` keyword required here
function detectCats(canvas, options) { ... }
class Kittydar { ... }
```

一個export列表不必是文件中的第一件事; 它可以出現在模塊文件的頂級範圍內的任何地方。您可以擁有多個export列表，或將export列表與其他export聲明混合使用，只要沒有名稱被多次導出即可。


### 重命名導入和導出

偶爾，導入的名稱會與您也需要使用的其他名稱發生衝突。所以 ES6 允許你在導入時重命名它們：

```
// suburbia.js

// Both these modules export something named `flip`.
// To import them both, we must rename at least one.
import {flip as flipOmelet} from "eggs.js";
import {flip as flipHouse} from "real-estate.js";
...
```
同樣，您可以在導出時重命名內容。如果您想以兩個不同的名稱導出相同的值，這很方便，這種情況偶爾會發生：

```
// unlicensed_nuclear_accelerator.js - media streaming without drm
// (not a real library, but maybe it should be)

function v1() { ... }
function v2() { ... }

export {
  v1 as streamV1,
  v2 as streamV2,
  v2 as streamLatestVersion
};
```

### 默認導出
新標準旨在與現有的 CommonJS 和 AMD 模塊進行互操作。所以假設你有一個 Node 項目並且你已經完成了npm install lodash. 你的 ES6 代碼可以從 Lodash 導入單個函數：

```
import {each, map} from "lodash";

each([3, 2, 1], x => console.log(x));
```
###### tags: `javaScript`