JS module的導出和導入

最近看了些Vue框架寫的程序,發現自己的前端知識還停留在幾年以前,發現現在Javascript程序里有各種各樣的對module的導入和到處,導入乍一看跟python的語法挺像的無非就是把fromimport這兩個關鍵詞的使用顛倒了一下順序。仔細看下來還是和python挺不一樣的import模塊的前提是模塊有導出,并且還分默認導出和命名導出,有些麻煩。所以今天這篇文章就把所有的export形式和相應的import使用匯總一下。

ES6在語言標準的層面上,實現了模塊功能,成為瀏覽器和服務器通用的模塊解決方案,完全可以取代 CommonJS 和 AMD 規范,基本特點如下:

  • 每一個模塊只加載一次, 每一個JS只執行一次, 如果下次再去加載同目錄下同文件,直接從內存中讀取;
  • 每一個模塊內聲明的變量都是局部變量, 不會污染全局作用域;
  • 模塊內部的變量或者函數可以通過export導出;
  • 一個模塊可以導入別的模塊

2.模塊功能主要由兩個命令構成:export和import。export命令用于規定模塊的對外接口,import命令用于輸入其他模塊提供的功能;

3.一個模塊就是一個獨立的文件,該文件內部的所有變量,外部無法獲取。如果你希望外部能夠讀取模塊內部的某個變量,就必須使用export關鍵字輸出該變量;

var year = '2018';
var month = 'Febuary';
export {year, month};

export 導出模塊

export語法聲明用于導出函數、對象、指定文件(或模塊)的原始值。 有兩種模塊導出方式:命名式導出(名稱導出)默認導出(定義式導出),命名式導出每個模塊可以有多個,而默認導出每個模塊僅一個 。

命名式導出

模塊可以通過export前綴關鍵詞聲明導出對象,導出對象可以是多個。這些導出對象用名稱進行區分,稱之為命名式導出

export { func }; // 導出一個已定義的函數func
export const foo = Math.sqrt(100); // 導出一個常量

我們可以使用*和from關鍵字來實現的模塊的繼承:

export * from 'base_module';

模塊導出時,可以指定模塊的導出成員。導出成員可以認為是類中的公有成員,而非導出成員可以認為是類中的私有成員:

var name = 'Kevin的居酒屋';
var domain = 'http://coffee.toast.com';export {name, domain}; // 相當于導出{name:name,domain:domain}

模塊導出時,我們可以使用as關鍵字對導出成員進行重命名,上面的導出可以這樣寫:

export {name as siteName, domain}

注意一下語法錯誤:

export 1; 
var a = 100;
export a;

export在導出接口的時候,必須與模塊內部的變量具有一一對應的關系。直接導出1沒有任何意義,也不可能在import的時候有一個變量與之對應export a雖然看上去成立,但是a的值是一個數字,根本無法完成解構,因此必須寫成export {a}的形式。即使a被賦值為一個函數,也是不建議使用上面的形式導出的因為大部分風格都建議,模塊中最好在末尾用一個export導出所有的接口,就像上面那些例子一樣。

默認導出

默認導出也被稱做定義式導出。命名式導出可以導出多個值,但在import引用時,也要使用相同的名稱來引用相應的值。默認導出只有導出一個單一值,這個輸出可以是一個函數、類或其它類型的值,這樣在模塊import導入時也會更 容易引用。

export default function() {}; // 導出一個函數
export default class(){}; // 導出一個類

默認導出可以理解為另一種形式的命名導出,默認導出可以認為是使用了default名稱的命名導出。

下面兩種導出方式是等價的:

const D = 123; 
export default D;
export { D as default };

使用名稱導出一個模塊時:

// "my-module.js" 模塊
function cube(x) {return x * x * x;
}
const foo = Math.PI + Math.SQRT2;
export { cube, foo };

在另一個模塊(js文件)中,我們可以像下面這樣引用:

import { cube, foo } from 'my-module';
console.log(cube(3));
console.log(foo);

使用默認導出一個模塊時:

// "my-module.js"模塊
export default function (x) {
return x * x * x;
}

在另一個模塊中,我們可以像下面這樣引用,相對名稱導出來說使用更為簡單:

import cube from 'my-module';
console.log(cube(3)); // 27

import導入模塊

import語法聲明用于從已導出的模塊、腳本中導入函數、對象、指定文件(或模塊)的原始值。import模塊導入與export模塊導出功能相對應,也存在兩種模塊導入方式:命名式導入(名稱導入)和默認導入(定義式導入)。

注意事項: import必須放在文件的最開始,且前面不允許有其他邏輯代碼,這和其他所有編程語言的導入風格一致。

命名導入

我們可以通過指定名稱將導入成員插入到當作用域中。可以導入單個成員或多個成員:

注意,花括號里面的變量與export后面的變量一一對應

import {myMember} from "my-module";
import {foo, bar} from "my-module";

通過*符號,我們可以導入模塊中的全部屬性和方法。當導入模塊全部導出內容時,就是將導出模塊(’my-module.js’)所有的導出綁定內容,插入到當前模塊(’myModule’)的作用域中:

import * as myModule from "my-module";

默認導入

在模塊導出時,可能會存在默認導出。同樣的,在導入時可以使用import指令導入這些默認值。直接導入默認值:

import defaultName from "my-module";
import myDefault, {foo, bar} from "my-module"; // 指定成員導入和默認導入

default關鍵字

// my-module.js
export default function() {}// 等效于:
function func() {};
export {func as default};

在import的時候,可以這樣用:

import a from './my-module';// 等效于,或者說就是下面這種寫法的簡寫
import {default as a} from './my-module';

這個語法糖的好處就是import的時候,可以省去{}。

簡單的說,如果import的時候,你發現某個變量沒有花括號括起來(沒有*號),那么你在腦海中應該把它還原成有花括號的{default as ...}語法,所以import $,{each,map}?from?'jquery';import后面第一個${default as $}的替代寫法。

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

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

相關文章

專訪雷果國:從1.5K到18K 一個程序員的5年成長之路

摘要:上段時間CSDN博客上流傳了一篇比較勵志的博文,講述了一個程序員從基礎薄弱到入職心儀公司的5年成長經歷,為了給那些待畢業或已畢業但對未來仍很迷茫的朋友指引前行的方向,CSDN專訪了這篇博文的作者。 導語:今年三月份&#…

真格量化——商品期權基本策略

#!/usr/bin/env python # coding:utf-8 from PoboAPI import * import datetime import time import numpy as np from copy import *#開始時間,用于初始化一些參數 def OnStart(context) :context.myacc = None#登錄交易賬號if context.accounts["回測期貨"].Login…

關于windows下的libtorch配置

關于windows下的libtorch配置 1.環境 Windows service 2012 R2/Windows10Cuda 9.0OpenCV3.4.1Libtorch1.0VS2017/VS20152.配置 第一步:CUDA 9.0cudnn7.5安裝(也可以用CUDA8.0) 如果已經安裝了cuda8.0及以上版本,可以忽略此步驟。 libtorch有cuda8.0 和cuda9.0的版本,為了與vs版…

spring集成多個rabbitMQ

轉自:https://blog.csdn.net/zz775854904/article/details/81092892 MQ全稱為Message Queue, 消息隊列(MQ)是一種應用程序對應用程序的通信方法。應用程序通過讀寫出入隊列的消息(針對應用程序的數據)來通信&#xff0…

解決(springboot項目)mysql表名大寫,造成jpa Table doesn't exist問題

這個問題有2種解決方法: 我的報錯是:java.sql.SQLSyntaxErrorException: Table gaei_ms.gaei_work_task doesnt exist方法一: 轉自:https://confluence.atlassian.com/fishkb/table-xxx-doesn-t-exist-error-with-mysql-server-30…

一個三流學校程序員的奮斗歷程

寫作用意 這些日子我一直在寫一個實時操作系統內核,已有小成了,等寫完我會全部公開,希望能夠為國內IT的發展盡自己一份微薄的力量。最近看到很多學生朋友和我當年一樣沒有方向,所以把我的經歷寫出來與大家共勉,希望能…

真格量化——做空波動率策略

# coding:utf-8 #!/usr/bin/env python # EmuCounter2 from PoboAPI import * import datetime import numpy as np#開始時間,用于初始化一些參數 def OnStart(context) :print "system starting..."#設定全局變量品種g.code1 = "m1901-C-3300.DCE" #豆粕…

搭建webpack基礎配置

搭建webpack基礎步驟: 1.去官方網站下載node.js(根據自己電腦的系統類型選擇) 2.安裝node.js完成后打開cmd命令提示符: 出現版本號證明安裝成功 3.cd到工程目錄下 npm install -g vue-cli(這里使用的是vue-cli腳手架安…

JPA 中 sql 預編譯 -- EntityManager 使用 預編譯

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 實現方式 : 1. 注入em: PersistenceContextprivate EntityManager entityManager; 注入方式 2: PersistenceUn…

持續記函數

自己寫文章的緣由 juejin.im/post/5c7368… 2019年2月26日 星期二 array_shift — 將數組開頭的單元移出數組 <?php $stack array("orange", "banana", "apple", "raspberry"); $fruit array_shift($stack); print_r($stack); ?…

研究:多感官教學增強記憶 學習效率事半功倍

人們在記憶外部信息時&#xff0c;必須先要去接受這些信息&#xff0c;而接受信息的“通道”不止一個&#xff0c;有視覺、聽覺、嗅覺、味覺、觸覺等等。有多種感官參加的記憶叫做“多通道”記憶。圖為臺中一幼稚園戶外寫生活動。 生動的教學方法往往可以吸引大多數孩子&#…

330 div+css Experience

今天學習的div&#xff0c;感覺對編輯html更為方便快捷&#xff0c;但還是需要多練&#xff0c;多熟悉一下思路和邏輯方式 越來越感覺&#xff0c;代碼不是重要的&#xff0c;重要的是方向和思路&#xff0c;am的float clearfloat 及屬性&#xff0c;還有overflow 溢出的三個屬…

時間序列的平穩性檢驗方法匯總

時間序列平穩性檢驗方法&#xff0c;可分為三類&#xff1a; 圖形分析方法 簡單統計方法 假設檢驗方法 一、圖形分析方法 可視化數據 可視化數據即繪制時間序列的折線圖&#xff0c;看曲線是否圍繞某一數值上下波動&#xff08;判斷均值是否穩定&#xff09;&#xff0c;看…

tcp的發送端一個小包就能打破對端的delay_ack么?

3.10內核&#xff0c;反向合入4.9的bbr。 最近分析bbr的時候&#xff0c;收集了線上的一些報文&#xff0c;其中有一個疑問一直在我腦海里面&#xff0c;如下&#xff1a; 本身處于delay_ack狀態的客戶端&#xff0c;大概40ms回復一個delay_ack&#xff0c;當收到一個490字節的…

設置 git pull 無需輸入賬號和密碼

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 如果你用git從遠程pull拉取代碼&#xff0c;每次都要輸入密碼&#xff0c;那么執行下面命令即可 git config --global credential.help…

Git 誕生記

你可能有過這樣的經歷&#xff1a;在 debug 的時候這里加一句&#xff0c;那里減一句&#xff0c;順便改改參數&#xff0c;不一會你的程序就從一個 bug 增加到了無數個 bug 。最重要的是&#xff0c;你完全想不起來自己到底改了幾個地方&#xff0c;原來的程序到底長什么樣子了…

使用pandas進行量化回測(akshare)

本人看法&#xff0c;也就比excel高級一點&#xff0c;距離backtrader這些框架又差一點。做最基礎的測試可以&#xff0c;如果后期加入加倉功能&#xff0c;或者是止盈止損等功能&#xff0c;很不合適。只能做最簡單的技術指標測試。所以別太當回事。 導包&#xff0c;常用包導…

【BZOJ4543】【POI2014】Hotel加強版(長鏈剖分)

傳送門 題意&#xff1a;求樹上滿足三點之間距離兩兩相等的三元組個數 n≤1e5n\le 1e5n≤1e5 原題數據是n≤5000n\le5000n≤5000 考慮怎么做f[u][i]f[u][i]f[u][i]表示uuu為根&#xff0c;深度為iii的點的個數g[u][i]g[u][i]g[u][i]表示uuu為根&#xff0c;滿足2點到lcalcalca的…

使用vue+webpack從零搭建項目

vue到現在已經成為一個熱門的框架&#xff0c;在項目實踐當中&#xff0c;如果想要創建一個新項目&#xff0c;通常都會使用vue-cli的腳手架工具&#xff0c;毋容置疑能夠方便很多&#xff0c;很多東西也不需要自己親自去配置。都知道&#xff0c;腳手架其實是vue結合webpack去…

CentOS 6 和 CentOS 7 防火墻的關閉

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。CentOS6.5查看防火墻的狀態&#xff1a; 1[linuxidclocalhost ~]$service iptable status顯示結果&#xff1a; 12345[linuxidclocalhost …