JS ES6中export和import詳解

1.Export

模塊是獨立的文件,該文件內部的所有的變量外部都無法獲取。如果希望獲取某個變量,必須通過export輸出,

// profile.js
export var firstName = 'Michael';
export var lastName = 'Jackson';
export var year = 1958;

或者用更好的方式:用大括號指定要輸出的一組變量

// profile.js
var firstName = 'Michael';
var lastName = 'Jackson';
var year = 1958;export {firstName, lastName, year};

除了輸出變量,還可以輸出函數或者類(class),

export function multiply(x, y) {return x * y;
};

還可以批量輸出,同樣是要包含在大括號里,也可以用as重命名:

function v1() { ... }
function v2() { ... }export {v1 as streamV1,v2 as streamV2,v2 as streamLatestVersion
};

JS ES6中export和import詳解

1.Export

模塊是獨立的文件,該文件內部的所有的變量外部都無法獲取。如果希望獲取某個變量,必須通過export輸出,

// profile.js
export var firstName = 'Michael';
export var lastName = 'Jackson';
export var year = 1958;

或者用更好的方式:用大括號指定要輸出的一組變量

// profile.js
var firstName = 'Michael';
var lastName = 'Jackson';
var year = 1958;export {firstName, lastName, year};

除了輸出變量,還可以輸出函數或者類(class),


export function multiply(x, y) {return x * y;
};

還可以批量輸出,同樣是要包含在大括號里,也可以用as重命名:

function v1() { ... }
function v2() { ... }export {v1 as streamV1,v2 as streamV2,v2 as streamLatestVersion
};

Attention:

export 命令規定的是對外接口,必須與模塊內部變量建立一一對應的關系

// 寫法一
export var m = 1;// 寫法二
var m = 1;
export {m};// 寫法三
var n = 1;
export {n as m};// 報錯
export 1;// 報錯
var m = 1;
export m;

報錯的寫法原因是:沒有提供對外的接口,第一種直接輸出1,第二種雖然有變量m,但還是直接輸出1,導致無法解構。

同樣的,function和class的輸出,也必須遵守這樣的寫法。

// 報錯
function f() {}
export f;// 正確
export function f() {};// 正確
function f() {}
export {f};

And:export語句輸出的接口,都是和其對應的值是動態綁定的關系,即通過該接口取到的都是模塊內部實時的值。

位置:export模塊可以位于模塊中的任何位置,但是必須是在模塊頂層,如果在其他作用域內,會報錯。

function foo() {export default 'bar' // SyntaxError
}
foo()

2.Import命令

export定義了模塊的對外接口后,其他JS文件就可以通過import來加載這個模塊,

// main.js
import {firstName, lastName, year} from './profile';function setName(element) {element.textContent = firstName + ' ' + lastName;
}

import命令接受一對大括號,里面指定要從其他模塊導入的變量名,必須與被導入模塊(profile.js)對外接口的名稱相同。

如果想重新給導入的變量一個名字,可以用as關鍵字,

import { lastName as surname } from './profile';

import后的from 可以指定需要導入模塊的路徑名,可以是絕對路徑,也可以是相對路徑, .js路徑可以省略,如果只有模塊名,不帶有路徑,需要有配置文件指定。

注意,import命令具有提升效果,會提升到整個模塊的頭部,首先執行。(是在編譯階段執行的)

因為import是靜態執行的,不能使用表達式和變量,即在運行時才能拿到結果的語法結構(e.g. if…else…)

3.module的整體加載

除了指定加載某個輸出值,還可以用(*)指定一個對象,所有的變量都會加載在這個對象上。

// circle.js。輸出兩個函數export function area(radius) {return Math.PI * radius * radius;
}export function circumference(radius) {return 2 * Math.PI * radius;
}// main.js 加載在個模塊import { area, circumference } from './circle';console.log('圓面積:' + area(4));
console.log('圓周長:' + circumference(14));//上面寫法是逐一指定要加載的方法,整體加載的寫法如下。
import * as circle from './circle';console.log('圓面積:' + circle.area(4));
console.log('圓周長:' + circle.circumference(14));

注意,模塊整體加載所在的那個對象(上例是circle),應該是可以靜態分析的,所以不允許運行時改變。

import * as circle from './circle';// 下面兩行都是不允許的
circle.foo = 'hello';
circle.area = function () {};

4.export default

之前的例子中,使用import導入時,都需要知道模塊中所要加載的變量名或函數名,用戶可能不想閱讀源碼,只想直接使用接口,就可以用export default命令,為模塊指定輸出

// export-default.js
export default function () {console.log('foo');
}

其他模塊加載該模塊時,import命令可以為該匿名函數指定任意名字。

// import-default.js
import customName from './export-default';
customName(); // 'foo'

export default也可以用于非匿名函數前。

下面比較一下默認輸出和正常輸出。

// 第一組
export default function crc32() { // 輸出// ...
}import crc32 from 'crc32'; // 輸入// 第二組
export function crc32() { // 輸出// ...
};import {crc32} from 'crc32'; // 輸入

可以看出,使用export default時,import語句不用使用大括號。

*******import和export命令只能在模塊的頂層,不能在代碼塊之中。否則會語法報錯。

這樣的設計,可以提高編譯器效率,但是沒有辦法實現運行時加載。

因為require是運行時加載,所以import命令沒有辦法代替require的動態加載功能。

所以引入了import()函數。完成動態加載。

import(specifier)

specifier用來指定所要加載的模塊的位置。import能接受什么參數,import()可以接受同樣的參數。

import()返回一個Promise對象。

const main = document.querySelector('main');import(`./section-modules/${someVariable}.js`).then(module => {module.loadPageInto(main);}).catch(err => {main.textContent = err.message;});

5.import()函數適用場合

1)按需加載:

button.addEventListener('click', event => {import('./dialogBox.js').then(dialogBox => {dialogBox.open();}).catch(error => {/* Error handling */})
});

above: import模塊在事件監聽函數中,只有用戶點擊了按鈕,才會加載這個模塊。

2)條件加載:

import()可以放在if…else語句中,實現條件加載。

if (condition) {import('moduleA').then(...);
} else {import('moduleB').then(...);
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/249389.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/249389.shtml
英文地址,請注明出處:http://en.pswp.cn/news/249389.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

巧用地圖

L1-1 天梯賽座位分配(20 分) 天梯賽每年有大量參賽隊員,要保證同一所學校的所有隊員都不能相鄰,分配座位就成為一件比較麻煩的事情。為此我們制定如下策略:假設某賽場有 N 所學校參賽,第 i 所學校有 M[i] 支…

Mac系統中MongoChef鏈接MongoDB集群的方法

第一步:啟動Mongochef,點擊鏈接按鈕;第二步:打開連接配置面板,填寫數據庫名;第三步:選擇鏈接類型Connection Type,一般分為直接連接和集群鏈接,這里選擇集群鏈接 Replica…

nginx配置文件nginx.conf

user www www;#指定nginx運行的用戶及用戶組,默認為nobodyworker_processes 8;#開啟的線程數,一般跟邏輯CPU核數一致error_log /alidata/log/nginx/error.log crit; #定位全局錯誤日志文件,級別以notice顯示,還有debug,info,warn,error,crit模…

js 中async

一、終極解決 異步操作是 JavaScript 編程的麻煩事,麻煩到一直有人提出各種各樣的方案,試圖解決這個問題。 從最早的回調函數,到 Promise 對象,再到 Generator 函數,每次都有所改進,但又讓人覺得不徹底。…

Python查找指定文件

在當前目錄以及當前目錄的所有子目錄下查找文件名包含指定字符串的文件,并打印出相對路徑: import os testfiles [] testfilepaths [] L len(os.path.abspath(.))def searchfile(path):for item in os.listdir(path):if os.path.isdir(os.path.join(p…

搭建Mock Server

搭建Mock Server 1.為什么要搭建mock-server? 為了更好的分工合作,讓前端能在不依賴后端環境的情況下進行開發,其中一種手段就是為前端開發者提供一個 web 容器,這個本地環境就是 mock-server。 目前很多前端 mock 數據的方案的…

請問1到10000之前,有多少升數字?(華圖教育面試題)

升數字就是從左向右讀,數值是依次上升的即可,比如123,1256,1389,但是1123,165就不是。以下是我的思路 public static void main(String[] args) {/*** 【請問1到10000之前,有多少升數字&#xf…

crm 一級菜單排序,二級菜單選中并且展開,非菜單權限的歸屬,權限粒度控制到按鈕級別...

排序 /rbac/templatetags/rbac.py from django import template from django.conf import settings import re from collections import OrderedDict register template.Library()register.inclusion_tag(rbac/menu.html) def menu(request):ordered_dictOrderedDict()menu_d…

Maven工程的多模塊

一個大項目需要一個團隊來完成,然后一個大型項目就拆分成幾塊來同時開發,節省時間,提高效率. 大致分為以下幾個模塊(僅是自身經歷): 依賴管理工程模塊:一般現在開發都是以maven來管理jar包,方便.所以整個工程的依賴統一放在一個單獨工程中,一般叫做父工程xxx-parent. 注意事項…

《淺談架構之路:前后端分離模式》

前言:分離模式 對前后端分離研究了一段時間,恰逢公司有一個大項目決定嘗試使用前后端分離模式進行,便參與其中。該項目從2016年初立項至今,平平穩穩得度過,但也涌現出越來越多的問題,絕對不是說前后端分離模…

查詢語句

1.基本查詢語句 1.1 語法: SELECT 屬性列表 FROM 表名或視圖列表 WHERE 條件表達式1 GROUP BY 屬性名1 | HAVING 條件表達式2 ORDER BY 屬性名2 ASC DESC 2.單表查詢 1.應用:查詢表中所有的記錄 2.查詢指定字段:查詢表中所有name字段的記錄 …

Nodejs+Koa2+云服務ECS 開發微信公眾號(一)之環境配置

硬件準備工作 1. 本人采用阿里云的云服務器,購買了入門級云服務ECS(293元每年); 2.針對服務器進行認證,設置個人服務器密碼; 3.購買數據盤,并將其掛載于云服務器之上(建議掛載在/…

中文詞頻統計與詞云生成

本次作業來源于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2822 中文詞頻統計 1. 下載一長篇中文小說。 下載長篇小說《西游記》 本次作業小說保存在txt文檔:xyj.txt 2. 從文件讀取待分析文本。 xyj open(rF:/xyj.txt,r,encodingutf-8)…

java SWT Browser實現瀏覽器功能并運行JavaScript代碼

一、創建簡單的瀏覽器 import org.eclipse.swt.*; import org.eclipse.swt.browser.*; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*;public class Myswt3 {public static void main(String [] args) {Display display new Display();final Shell she…

[JZOJ5866]【NOIP2018模擬9.13】指引

Description Input Output Sample Input 6 3 2 0 3 1 1 3 4 2 0 4 5 5 Sample Output 2 Data Constraint Hint 貪心,把旅行者和出口的x坐標降序排序。 然后從前往后掃,如果是出口,就把y坐標插進set里,如果是旅行者,就查…

scrapy框架之遞歸解析和post請求

今日概要 遞歸爬取解析多頁頁面數據scrapy核心組件工作流程scrapy的post請求發送今日詳情 1.遞歸爬取解析多頁頁面數據 - 需求:將糗事百科所有頁碼的作者和段子內容數據進行爬取切持久化存儲 - 需求分析:每一個頁面對應一個url,則scrapy工程需…

SmartGit 過期解決方案之 非商業版本安裝使用

作為前端開發的小伙伴一定有這樣的困惑,自己在日常的團隊協作配合時,提交代碼和解決沖突是我們最頭疼的問題,但是又不喜歡使用Eclipse或者IDEA這種超級占內存的編輯器,使用Git命令又是那么捉襟見肘,所以有一個好用的輕…

HDU6438 Buy and Resell 解題報告(一個有趣的貪心問題的嚴格證明)

寫在前面 此題是一個很容易想到的貪心題目,但是正確性的證明是非常復雜的。然而,目前網上所有題解并未給出本題貪心算法的任何正確性證明,全部僅停留在描述出一個貪心算法。本著對算法與計算機科學的熱愛(逃)&#xff…

Webpack不生成index.html

沒有導出你的最后2個插件,并且沒有指定html文件名dist,因為HtmlWebpackPlugin應該生成相對于path,下面是固定配置: var path require(path)var webpack require(webpack)var HtmlWebpackPlugin require(html-webpack-plugin);m…

CSS3筆記之定位篇(一)relative

知識點1:relative和absolute relative: 相對自身,并會限制內部absolute元素層疊 absolute: 相對容器,并受到父類容器relative的影響,比如:overflow:hidden/scroll fixed: 不受relative限制,只受z-index的…