首頁 web前端 js教程 require的五種用法介紹

require的五種用法介紹

Jun 17, 2017 pm 05:22 PM
require 介紹 用法

這篇文章主要介紹了詳解webpack解惑:require的五種用法,具有一定的參考價值,有興趣的小夥伴們可以參考一下

webpack中可以寫commonjs格式的require同步語法,可以寫AMD格式的require回呼語法,還有一個require.ensure,以及webpack自己定義的require.include,再加上ES6的import語法,這麼多豈不是會把人搞亂。本篇就來梳理一下這些req​​uire各自的特點,以及都在什麼場景下使用。

commonjs同步語法

經典的commonjs同步語法如下:


var a = require('./a');
a.show();
登入後複製

此時webpack會將a .js打包進引用它的檔案中。這是最普遍的情形,不必贅述。

 commonjs非同步載入

在commonjs中有一個Modules/Async/A規範,裡面定義了require.ensure語法。 webpack實現了它,作用是可以在打包的時候進行程式碼分片,並非同步載入分片後的程式碼。用法如下:


require.ensure([], function(require){

  var list = require('./list');

  list.show();

});
登入後複製

此時list.js會被打包成一個單獨的chunk文件,大概長這樣:

1.fb874860b35831bc96a8.js

可讀性比較差。我在上一篇結尾也提到了,給它命名的方式,那就是給require.ensure傳遞第三個參數,如:


##

require.ensure([], function(require){

  var list = require('./list');

  list.show();

}, 'list');
登入後複製

這樣就能得到你想要的檔案名稱:

list.fb874860b35831bc96a8.js

你也可以傳入像"question/list"這樣帶層級的名字,這樣webpack會依照層級給你建立資料夾。

要注意的是,如果你在require.ensure的

函數中引用了兩個以上的模組,webpack會把它們打包在一起,例如:


#

require.ensure([], function(require){

  var list = require('./list');

  list.show();

  var edit = require('./edit');

  edit.display();

}, 'list_and_edit');
登入後複製

list.js和edit.js將會被打包成一個文件,並命名為list_and_edit.js。這就需要根據你的實際情況來衡量了,如果你不希望打包在一起,只能寫兩個require.ensure分別引用這兩個文件。

多說一句,這種思維其實我是很不喜歡的,在程式設計階段卻要對打包的事情做出決策,明顯違背了職責分離原則。

 commonjs預先載入懶執行

在上面的用法中,我們給require.ensure的第一個參數傳了空數組,實際上這裡是可以接收模組名稱的,作用就是實作預先載入懶執行。用法如下:


require.ensure(['./list'], function(require){

  var list = require('./list');

  list.show();

});
登入後複製

給require.ensure的第一個參數傳了['./list'],執行到這裡的時候list.js會被瀏覽器下載下來,但並不會執行list.js模組中的程式碼,也就是webpack官網說的,不會進行evaluate。真正進行evaluate的時候是到了後面這句var list = require('./list');這就是所謂的懶執行。

寫在函數中的多個模組會被打包在一起,這一點和上面沒有區別。另外,寫在陣列中的模組也會跟​​他們打包在一起,不管你有沒有手動執行。

這種寫法也是有點彆扭的,像是commonjs和AMD的結合體,而且一個模組名稱還要寫兩次,真是不夠優雅。所以webpack自己定義了一個方法,能夠實現預先載入。

 webpack自帶的require.include

require.include是webpack自己提供的,並沒有什麼規範做後台,所以是個小角色。它可以實作上面是預先載入功能,而不用把模組寫在陣列中,用法如下:


#

require.ensure([], function(require){

  require.include('./list');//此处只加载不执行

});
登入後複製

根據webpack官網文檔介紹,require.include還有一個作用是能把子模組中的公共部分,提取到父模組中,例如child1和child2都引用了list.js這個模組,那麼如果在parent中include了list.js,那麼子模組中的就會被刪掉,相當於提升到了父模組中。 (這裡所謂的父子關係是指引用關係)

這個方法官方也是一筆帶過,看來也是一個雞肋的東西,用處不大。因為我發現require.include的回傳值是undefined,也就是說,如果你想使用模組,姿勢是這樣的:


require.ensure([], function(require){
  require.include('./preview'); //加载
  let p = require('./preview'); //执行
  p.getUrl(); //使用
}, 'pre');
登入後複製

AMD非同步載入

webpack既支援commonjs規範也支援AMD規範,這意味著AMD的經典語法是可以正常使用的,如:

##

require(['./list'], function(list){

  list.show();

});
登入後複製

當然,這樣寫的話list.js也是被單獨打包成一個檔案的。與上面類似,如果你在這裡寫了多個模組,那麼這些模組都會被打包成一個文件,如:

require(['./list', './edit'], function(list, edit){

  list.show();

  edit.display();

});
登入後複製

list.js和edit.js會被打包在一起。不同的是,AMD的方式無法傳入第三個參數當檔名,所以得不到很好看的檔案。

ES6 import

这年头不用ES6都不好意思跟人打招呼。所以我们的代码中,又会多一种模块引入语法,那就是import。import会被转化为commonjs格式或者是AMD格式,所以不要把它认为是一种新的模块引用方式。babel默认会把ES6的模块转化为commonjs规范的,你也不用费劲再把它转成AMD了。

所以如下写法是等价的:


import list from './list';

//等价于

var list = require('./list');
登入後複製

不过这两种写法只需选一种,避免在代码中同时使用两种,否则会造成混淆。

总结

以上把require的用法捋了一遍,明白了各自用法的区别之后,我们就可以在项目中进行选择了。我觉得最佳选择是往commonjs方向靠拢,想尝试ES6的话就用import代替commonjs同步语法即可。

因此,代码中保持以下两种风格就好:


//可打包在一起的同步代码,使用import语法

import list from './list';

 

//需要独立打包、异步加载的代码,使用require.ensure

require.ensure([], function(require){

  var list = require('./list');

});
登入後複製

很显然,你在写代码的时候还是需要对打包结果进行决策,这是我不喜欢webpack的原因。gulp那样多好,编码就是编码,编译就是编译,分开来。不过这就是webpack以模块为核心的打包方式的特点吧,仁者见仁,只要团队内做一个约定,也不会打的一塌糊涂。

以上是require的五種用法介紹的詳細內容。更多資訊請關注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

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

熱工具

記事本++7.3.1

記事本++7.3.1

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

wapi是什麼東西詳細介紹 wapi是什麼東西詳細介紹 Jan 07, 2024 pm 09:14 PM

wapi這個名詞使用者可能在使用網路得時候見過過,但是對於一部分人來說肯定都不知道wapi是什麼,下面就帶來了詳細介紹,幫助不知道小伙伴去了解。 wapi是什麼東西:答:wapi是無線區域網路鑑別和保密的基礎架構。這就像紅外線和藍牙等功能一樣,一般都覆蓋在辦公大樓等地方的附近。基本上都是為一個小部門所有的,所以這個功能涉及的範圍只有幾公里。 wapi相關介紹:1、wapi是無線區域網路裡面的一種傳輸協定。 2.這款技術是可以去避免窄頻帶通訊的問題,可以更好的去進行傳播。 3.只要只需要一個代碼就可以去傳送訊號了

詳解win11能否運行PUBG遊戲 詳解win11能否運行PUBG遊戲 Jan 06, 2024 pm 07:17 PM

pubg又稱絕地求生,是一款非常經典的射擊大逃殺類型遊戲,從2016年火爆以來一直擁有非常多的玩家。在最近的win11系統推出後,就有不少玩家想要在win11上游玩它,下面就跟著小編來看看win11是否可以玩pubg吧。 win11能玩pubg嗎:答:win11可以玩pubg。 1.在win11推出之初,因為win11需要開啟tpm的緣故,所以導致很多玩家被pubg封號處理了。 2.不過後來根據玩家的回饋,藍洞方面已經解決了這個問題,目前已經可以在win11中正常玩pubg了。 3.如果大家遇到了pub

解析JSP註解的使用方法和分類 解析JSP註解的使用方法和分類 Feb 01, 2024 am 08:01 AM

JSP註解的分類及用法解析JSP註解分為兩種:單行註解:以結尾,只能註解單行程式碼。多行註解:以/*開頭,以*/結尾,可以註解多行程式碼。單行註解範例多行註解範例/**這是一段多行註解*可以註解多行程式碼*/JSP註解的用法JSP註解可以用來註解JSP程式碼,使其更易於閱

WPSdatedif函數的用法 WPSdatedif函數的用法 Feb 20, 2024 pm 10:27 PM

WPS是一款常用的辦公室軟體套件,其中的WPS表格功能被廣泛用於資料處理和計算。在WPS表格中,有一個非常有用的函數,即DATEDIF函數,它用於計算兩個日期之間的時間差。 DATEDIF函數是英文單字DateDifference的縮寫,它的語法如下:DATEDIF(start_date,end_date,unit)其中,start_date表示起始日期

如何正確使用C語言的exit函數 如何正確使用C語言的exit函數 Feb 18, 2024 pm 03:40 PM

c語言exit函數怎麼用,需要具體程式碼範例在C語言中,我們常常需要在程式中提前終止程式的執行,或是在某個特定的條件下退出程式。 C語言提供了exit()函數來實作這個功能。本文將介紹exit()函數的用法,並提供對應的程式碼範例。 exit()函數是C語言中的標準函式庫函數,它包含在頭檔中。它的作用是終止程式的執行,並且可以帶一個整數

介紹最新的Win 11聲音調法方法 介紹最新的Win 11聲音調法方法 Jan 08, 2024 pm 06:41 PM

很多用戶更新了最新的win11之後發現自己系統的聲音有了些許的變化,但是又不知道該怎麼去進行調整,所以今天本站就給你們帶來了電腦最新win11聲音調法介紹,操作不難而且選擇多樣,快來一起下載試試吧。電腦最新系統windows11聲音如何調1、先右鍵點選桌面右下角的聲音圖標,並選擇「播放設定」。 2、然後進入設定中點選播放列中的「揚聲器」。 3、隨後點選右下方的「屬性」。 4.點選屬性中的「增強」選項列。 5.此時如果「禁用所有聲音效果」前的√勾上了就把他取消。 6、之後就可以選擇下面的聲音效果來進行設定並點

PyCharm新手指南:取代功能全面解析 PyCharm新手指南:取代功能全面解析 Feb 25, 2024 am 11:15 AM

PyCharm是一款功能強大的Python整合開發環境,具有豐富的功能與工具,能夠大幅提升開發效率。其中,替換功能是開發過程中常用的功能之一,能夠幫助開發者快速修改程式碼並提高程式碼品質。本文將詳細介紹PyCharm的替換功能,並結合具體的程式碼範例,幫助新手更好地掌握和使用該功能。替換功能簡介PyCharm的替換功能可以幫助開發者在程式碼中快速替換指定的文本

MySQL ISNULL 函數詳解及用法介紹 MySQL ISNULL 函數詳解及用法介紹 Mar 01, 2024 pm 05:24 PM

MySQL中的ISNULL()函數是用來判斷指定表達式或列是否為NULL的函數。它傳回一個布林值,如果表達式為NULL則回傳1,否則回傳0。 ISNULL()函數可以在SELECT語句中使用,也可以在WHERE子句中進行條件判斷。 1.ISNULL()函數的基本語法:ISNULL(expression)其中,expression是要判斷是否為NULL的表達式或

See all articles