首頁 web前端 js教程 Node的require和import用法詳細介紹

Node的require和import用法詳細介紹

Aug 15, 2017 am 10:20 AM
import node require

本篇文章主要介紹了詳解Node中導入模組require和import的區別,具有一定的參考價值,有興趣的小伙伴們可以參考一下。

ES6標準發布後,module成為標準,標準的使用是以export指令導出接口,以import引入模組,但是在我們一貫的node模組中,我們採用的是CommonJS規範,使用require引入模組,使用module.exports導出介面。

不把require和import整清楚,會在未來的標準程式中死的很難看。

require時代的模組

node程式設計中最重要的思想之一就是模組,而正是這個思想,讓JavaScript的大規模工程成為可能。模組化編程在js界流行,也是基於此,隨後在瀏覽器端,requirejs和seajs之類的工具包也出現了,可以說在對應規範下,require統治了ES6之前的所有模組化編程,即使現在,在ES6 module被完全實現之前,還是這樣。

node的module遵循CommonJS規範,requirejs遵循AMD,seajs遵循CMD,雖然各有不同,但總之還是希望保持較統一的程式碼風格。


// a.js

// -------- node -----------
module.exports = {
 a : function() {},
 b : 'xxx'
};

// ----------- AMD or CMD ----------------
define(function(require, exports, module){
 module.exports = {
  a : function() {},
  b : 'xxx'
 };
});
登入後複製

可以看出,為了保持風格的高度統一,除了在瀏覽器端的模組中要使用一個define函數來提供模組的閉包以外,其他程式碼可以完全一致。


// b.js

// ------------ node ---------
var m = require('./a');
m.a();

// ------------ AMD or CMD -------------
define(function(require, exports, module){
  var m = require('./a');
  m.a();
});
登入後複製

在使用上,也非常相似。雖然AMD or CMD提供了更豐富的風格,但我們本文主要是討論node環境下,所以不做擴充。

ES6中的module

ES6發布的module並沒有直接採用CommonJS,甚至連require都沒有採用,也就是說require仍然只是node的一個私有的全域方法,module.exports也只是node私有的一個全域變數屬性,跟標準半毛錢關係都沒有。

export導出模組介面

export的用法挺複雜的,具體有哪些可以看 這裡 。這裡舉幾個例子:


// a.js
export default function() {}
export function a () {}

var b = 'xxx';
export {b}; // 这是ES6的写法,实际上就是{b:b}
setTimeout(() => b = 'ooo', 1000);
export var c = 100;
登入後複製

在要匯出的介面前面,加入export指令。

在export之後,b還可以被修改,這和CommonJS有著巨大不同,關於內部機理的東西,本文就無恥的省略了。

注意,下面的語法有嚴重錯誤:


// 错误演示
export 1; // 绝对不可以
var a = 100;
export a;
登入後複製

export在導出介面的時候,必須與模組內部的變數有一個對應的關係。直接導出1沒有任何意義,也不可能在import的時候有一個變數與之對應。 export a 雖然看起來成立,但是 a 的值是一個數字,根本無法完成解構,因此必須寫成 export {a} 的形式。即使a被賦值為一個function,也是不被允許的。而且,大部分風格都建議,模組中最好在末尾用一個export導出所有的接口,例如:


#
export {fun as default,a,b,c};
登入後複製

import導入模組

import的語法跟require不同,而且import必須放在檔案的最開始,且前面不允許有其他邏輯程式碼,這和其他所有程式語言風格一致。

import的使用和export一樣,也挺複雜,可以在 這裡 大致了解。舉幾個例子:


import $ from 'jquery';
import * as _ from '_';
import {a,b,c} from './a';
import {default as alias, a as a_a, b, c} from './a';
登入後複製

這裡有一些坑,暫時不透露,下面會講到。

import後面跟上花括號的形式是最基本的用法,花括號裡面的變數與export後面的變數一一對應。在這裡,你必須了解 物件的解構賦值 的知識,沒這知識,你根本沒辦法在這裡裝逼。了解了解構賦值,這裡的「一一對應」的關係就能具體理解了。

as關鍵字

程式設計的同學對as都容易理解,簡單的說就是取一個別名。 export中可以用,import其實可以用:


// a.js
var a = function() {};
export {a as fun};

// b.js
import {fun as a} from './a';
a();
登入後複製

上面這段程式碼,export的時候,對外提供的介面是fun,它是a.js內部a這個函數的別名,但是在模組外面,認不到a,只能認到fun。

import中的as就很簡單,就是你在使用模組裡面的方法的時候,給這個方法取一個別名,好在目前的檔案裡面使用。之所以是這樣,是因為有的時候不同的兩個模組可能透過相同的接口,例如有一個c.js也通過了fun這個接口:


// c.js
export function fun() {};
登入後複製

如果在b.js中同時使用a和c這兩個模組,就必須想辦法解決介面重名的問題,as就解決了。

default關鍵字

其他人寫教學什麼的,都把default放到export那個部分,我覺得不利於理解。在export的時候,可能會用到default,說白了,它其實是別名的語法糖:


// d.js
export default function() {}

// 等效于:
function a() {};
export {a as default};
登入後複製

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


import a from './d';

// 等效于,或者说就是下面这种写法的简写,是同一个意思
import {default as a} from './d';
登入後複製

這個語法糖的好處就是import的時候,可以省去花括號{}。簡單的說,如果import的時候,你發現某個變數沒有花括號括起來(沒有*號),那麼你在腦海中應該把它還原成有花括號的as語法。

所以,下面这种写法你也应该理解了吧:


import $,{each,map} from 'jquery';
登入後複製

import后面第一个 $ 是 {defalut as $} 的替代写法。

*符号

*就是代表所有,只用在import中,我们看下两个例子:


import * as _ from '_';
登入後複製

在意义上和 import _ from '_'; 是不同的,虽然实际上后面的使用方法是一样的。它表示的是把 '_' 模块中的所有接口挂载到 _ 这个对象上,所以可以用 _.each调用某个接口。

另外还可以通过*号直接继承某一个模块的接口:


export * from '_';

// 等效于:
import * as all from '_';
export all;
登入後複製

*符号尽可能少用,它实际上是使用所有export的接口,但是很有可能你的当前模块并不会用到所有接口,可能仅仅是一个,所以最好的建议是使用花括号,用一个加一个。

该用require还是import?

require的使用非常简单,它相当于module.exports的传送门,module.exports后面的内容是什么,require的结果就是什么,对象、数字、字符串、函数……再把require的结果赋值给某个变量,相当于把require和module.exports进行平行空间的位置重叠。

而且require理论上可以运用在代码的任何地方,甚至不需要赋值给某个变量之后再使用,比如:


require('./a')(); // a模块是一个函数,立即执行a模块函数
var data = require('./a').data; // a模块导出的是一个对象
var a = require('./a')[0]; // a模块导出的是一个数组
登入後複製

你在使用时,完全可以忽略模块化这个概念来使用require,仅仅把它当做一个node内置的全局函数,它的参数甚至可以是表达式:


require(process.cwd() + '/a');
登入後複製

但是import则不同,它是编译时的(require是运行时的),它必须放在文件开头,而且使用格式也是确定的,不容置疑。它不会将整个模块运行后赋值给某个变量,而是只选择import的接口进行编译,这样在性能上比require好很多。

从理解上,require是赋值过程,import是解构过程,当然,require也可以将结果解构赋值给一组变量,但是import在遇到default时,和require则完全不同: var $ = require('jQuery'); 和 import $ from 'jquery' 是完全不同的两种概念。

上面完全没有回答“改用require还是import?”这个问题,因为这个问题就目前而言,根本没法回答,因为目前所有的引擎都还没有实现import,我们在node中使用babel支持ES6,也仅仅是将ES6转码为ES5再执行,import语法会被转码为require。这也是为什么在模块导出时使用module.exports,在引入模块时使用import仍然起效,因为本质上,import会被转码为require去执行。

但是,我们要知道这样一个道理,ES7很快也会发布,js引擎们会尽快实现ES6标准的规定,如果一个引擎连标准都实现不了,就会被淘汰, ES6是迟早的事 。如果你现在仍然在代码中部署require,那么等到ES6被引擎支持时,你必须升级你的代码,而如果现在开始部署import,那么未来可能只需要做很少的改动。

以上是Node的require和import用法詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1325
25
PHP教程
1273
29
C# 教程
1252
24
vue3+vite:src使用require動態匯入圖片報錯怎麼解決 vue3+vite:src使用require動態匯入圖片報錯怎麼解決 May 21, 2023 pm 03:16 PM

vue3+vite:src使用require動態導入圖片報錯和解決方法vue3+vite動態的導入多張圖片vue3如果使用的是typescript開發,就會出現require引入圖片報錯,requireisnotdefined不能像使用vue2這樣imgUrl:require(' …/assets/test.png')導入,是因為typescript不支援require所以用import導入,下面介紹如何解決:使用awaitimport

nvm 怎麼刪除node nvm 怎麼刪除node Dec 29, 2022 am 10:07 AM

nvm刪除node的方法:1、下載「nvm-setup.zip」並將其安裝在C碟;2、設定環境變量,並透過「nvm -v」指令查看版本號;3、使用「nvm install」指令安裝node;4、透過「nvm uninstall」指令刪除已安裝的node即可。

node專案中如何使用express來處理檔案的上傳 node專案中如何使用express來處理檔案的上傳 Mar 28, 2023 pm 07:28 PM

怎麼處理文件上傳?以下這篇文章為大家介紹一下node專案中如何使用express來處理文件的上傳,希望對大家有幫助!

Pi Node教學:什麼是Pi節點?如何安裝和設定Pi Node? Pi Node教學:什麼是Pi節點?如何安裝和設定Pi Node? Mar 05, 2025 pm 05:57 PM

PiNetwork節點詳解及安裝指南本文將詳細介紹PiNetwork生態系統中的關鍵角色——Pi節點,並提供安裝和配置的完整步驟。 Pi節點在PiNetwork區塊鏈測試網推出後,成為眾多先鋒積極參與測試的重要環節,為即將到來的主網發布做準備。如果您還不了解PiNetwork,請參考Pi幣是什麼?上市價格多少? Pi用途、挖礦及安全性分析。什麼是PiNetwork? PiNetwork項目始於2019年,擁有其專屬加密貨幣Pi幣。該項目旨在創建一個人人可參與

深入淺析Node的進程管理工具'pm2” 深入淺析Node的進程管理工具'pm2” Apr 03, 2023 pm 06:02 PM

這篇文章跟大家分享Node的進程管理工具“pm2”,聊聊為什麼需要pm2、安裝和使用pm2的方法,希望對大家有幫助!

npm node gyp失敗怎麼辦 npm node gyp失敗怎麼辦 Dec 29, 2022 pm 02:42 PM

npm node gyp失敗是因為“node-gyp.js”跟“Node.js”版本不匹配,其解決辦法:1、透過“npm cache clean -f”清除node快取;2、透過“npm install -g n”安裝n模組;3、透過「n v12.21.0」指令安裝「node v12.21.0」版本即可。

聊聊用pkg將Node.js專案打包為執行檔的方法 聊聊用pkg將Node.js專案打包為執行檔的方法 Dec 02, 2022 pm 09:06 PM

如何用pkg打包nodejs可執行檔?以下這篇文章跟大家介紹一下使用pkg將Node專案打包為執行檔的方法,希望對大家有幫助!

使用Angular和Node進行基於令牌的身份驗證 使用Angular和Node進行基於令牌的身份驗證 Sep 01, 2023 pm 02:01 PM

身份驗證是任何網路應用程式中最重要的部分之一。本教程討論基於令牌的身份驗證系統以及它們與傳統登入系統的差異。在本教程結束時,您將看到一個用Angular和Node.js編寫的完整工作演示。傳統身份驗證系統在繼續基於令牌的身份驗證系統之前,讓我們先來看看傳統的身份驗證系統。使用者在登入表單中提供使用者名稱和密碼,然後點擊登入。發出請求後,透過查詢資料庫在後端驗證使用者。如果請求有效,則使用從資料庫中獲取的使用者資訊建立會話,然後在回應頭中傳回會話訊息,以便將會話ID儲存在瀏覽器中。提供用於存取應用程式中受

See all articles