果你正在構(gòu)建網(wǎng)站或Web應(yīng)用程序,你應(yīng)該已經(jīng)知道代碼重復(fù)被認(rèn)為是一種不良實(shí)踐。
這就是為什么你應(yīng)該學(xué)習(xí)如何使用CSS變量來(lái)減少你編寫的CSS代碼量并將你的樣式帶到一個(gè)新的水平。
最成功的Web應(yīng)用程序擁有令人驚嘆的設(shè)計(jì)。不幸的是,為了達(dá)到預(yù)期的效果,Web開發(fā)人員需要準(zhǔn)備大量的樣式。這迫使我們?cè)谠S多不同的元素中重復(fù)值,比如顏色。
幸運(yùn)的是,現(xiàn)代樣式表支持CSS變量,這使您可以減少代碼庫(kù)中的重復(fù)。你不需要像CSS模塊、Less或SASS這樣的外部工具來(lái)利用它。
在這個(gè)全面的指南中,我將向您展示如何有效地使用CSS變量,涵蓋從純HTML和CSS的基本示例到更高級(jí)的框架,如React和Next.js。
(本文內(nèi)容參考:java567.com)
JavaScript 模塊是現(xiàn)代前端開發(fā)中的重要組成部分。它們?cè)试S開發(fā)者將代碼組織成獨(dú)立、可重用的單元,從而提高了代碼的可維護(hù)性、可擴(kuò)展性和可讀性。本文將深入探討 JavaScript 模塊的概念、語(yǔ)法和最佳實(shí)踐,幫助你充分利用模塊化開發(fā)的優(yōu)勢(shì)。
JavaScript 模塊是指將代碼封裝在單獨(dú)的文件中,并按需導(dǎo)出和導(dǎo)入其中的功能。它們可以包含變量、函數(shù)、類和其他任何 JavaScript 實(shí)體。模塊有自己的作用域,而不是和腳本一樣在全局作用域內(nèi)執(zhí)行代碼。一組相互導(dǎo)入、導(dǎo)出的模塊組成的圖形通常被稱為模塊樹。
在過(guò)去,JavaScript 沒(méi)有原生的模塊系統(tǒng),但隨著 ECMAScript 6(ES6)的出現(xiàn),現(xiàn)在我們可以使用 import 和 export 關(guān)鍵字來(lái)定義和使用模塊。
一個(gè)模塊可包含多個(gè) 命名導(dǎo)出 以及 單個(gè)默認(rèn)導(dǎo)出。可使用導(dǎo)出聲明指定從模塊中導(dǎo)出的內(nèi)容,聲明以關(guān)鍵字 export 開頭,示例如下:
export function fun() {
// ...
}
export const name='aa';
可以使用 導(dǎo)入聲明 (也被稱為靜態(tài)導(dǎo)入) 或 動(dòng)態(tài)導(dǎo)入 來(lái)加載模塊并從其中導(dǎo)入內(nèi)容。導(dǎo)入聲明使用關(guān)鍵字 import,接著是要導(dǎo)入的內(nèi)容,然后是關(guān)鍵字 from,之后是指定從哪一個(gè)模塊導(dǎo)入的模塊說(shuō)明符的字符串字面量。示例如下:
import { fun } from './mod.js';
import { fun1 } from './mod.js';
或
import { greet, pi } from './myModule.js';
一個(gè)模塊只能有一個(gè)默認(rèn)導(dǎo)出或者沒(méi)有,多個(gè)默認(rèn)導(dǎo)出,代碼會(huì)報(bào)錯(cuò)。注意單詞 default。
export default functio test() {
// ...
}
或
function test() {}
export default test;
默認(rèn)導(dǎo)出對(duì)應(yīng)的導(dǎo)入方式如下,注意這里沒(méi)有大括號(hào)。
import test from './mod.js';
也可以不列出任何導(dǎo)入的內(nèi)容,從而只使用導(dǎo)入模塊的副作用。只是加載對(duì)應(yīng)的模塊以及它依賴的模塊,并且執(zhí)行它的代碼,但是不導(dǎo)入任何內(nèi)容。
import './modk.js';
注意:
export const age=32;
export let name='javascript';
export var username='jack';
export function test() {}
export class Example {}
const age=32;
let name='javascript';
var username='jack';
function test() {}
class Example {}
// 獨(dú)立使用單個(gè)聲明
export { age, name, username, test, Example };
// 獨(dú)立使用多個(gè)聲明
export { age, name };
export { username };
export { test, Example };
export { age, name, username, test, Example };
const age=32;
let name='javascript';
var username='jack';
function test() {}
class Example {}
export const age=32;
let name='javascript';
var username='jack';
export function test() {}
class Example {}
export { name, username, Example };
注意導(dǎo)出的唯一限制是 導(dǎo)出的名稱必須是唯一的,不能重復(fù)。
以示例解釋:
import { test } from './ab.js';
模塊說(shuō)明符指的是單詞 from 后面的 './ab.js' 部分。在導(dǎo)入聲明中,模塊說(shuō)明符必須是一個(gè) 字符串字面量,不能只是返回字符串的表達(dá)式,因?yàn)槁暶魇庆o態(tài)的,在執(zhí)行代碼前必須解析他們。單引號(hào)或雙引號(hào)都可以使用。
瀏覽器中使用
模塊說(shuō)明符要么是 絕對(duì)URL,要么是以 /(斜線), ./(點(diǎn)斜線), ../(點(diǎn)點(diǎn)斜線) 開頭的 相對(duì)URL。模塊有最終解析的 URL 確定。
以下有效說(shuō)明符介紹:
import /*...*/ from "http://test.com/a.js"; // 絕對(duì)路徑
import /*...*/ from "/a.js"; // 以 / 開始
import /*...*/ from "./bbb.js"; // 以 ./ 開始
import /*...*/ from "../ccc.js"; // 以 ../ 開始
import /*...*/ from "./test/a.js"; // 以 ./ 開始
以下在目前瀏覽器中, 是無(wú)效的:
import /*...*/ from "a";
import /*...*/ from "a.js";
從模塊導(dǎo)出的標(biāo)識(shí)符不必與模塊代碼中的標(biāo)識(shí)符相同,可以使用導(dǎo)出聲明中的 as 子句重命名導(dǎo)出:
let name='java';
export { name as username };
在另一個(gè)模塊使用名稱 username 將其導(dǎo)入:
import { username } from './a.js';
name 只是僅用戶模塊內(nèi)部,而不是模塊外部。只能在獨(dú)立導(dǎo)出時(shí)使用重命名,而不能在內(nèi)聯(lián)導(dǎo)出時(shí)使用重命名。
export let name as username='java'; // 這樣重命名是錯(cuò)誤的
如果想創(chuàng)建別名,可以使用一個(gè)內(nèi)聯(lián)命名導(dǎo)出,然后使用重命名導(dǎo)出:
export let name="java";
export { name as usernam };
// 這樣為同一個(gè)函數(shù)創(chuàng)建了兩個(gè)導(dǎo)出: name 和 username
模塊可以重新導(dǎo)出另一個(gè)模塊的導(dǎo)出:
export { name } from './b.js';
使用 星號(hào)(*) 來(lái)導(dǎo)出其他模塊的所有 命名導(dǎo)出 ,不能導(dǎo)出 默認(rèn)導(dǎo)出 。
export * from "./a.js";
重新導(dǎo)出時(shí)可以使用 as 字句更改導(dǎo)出的名稱:
export { name as username } from './ab.js';
如果兩個(gè)模塊都導(dǎo)出了函數(shù)test, 并且想在模塊中使用這兩個(gè)函數(shù),或者模塊使用的名稱與代碼某些內(nèi)容沖突,這時(shí)可以使用 as 子句進(jìn)行重命名導(dǎo)入。
import { test as testOne } from './a.js';
import { test as testTwo } from './b.js';
// 調(diào)用它們
testOne();
testTwo();
JavaScript 模塊為開發(fā)者提供了一種強(qiáng)大的工具,用于組織、封裝和重用代碼。通過(guò)合理地利用模塊化開發(fā)的技術(shù)和最佳實(shí)踐,我們可以構(gòu)建出更加靈活、可靠和可維護(hù)的應(yīng)用程序。開始使用模塊化開發(fā),解鎖 JavaScript 開發(fā)的新境界!
著網(wǎng)站功能逐漸豐富,網(wǎng)頁(yè)中的js也變得越來(lái)越復(fù)雜和臃腫,原有通過(guò)script標(biāo)簽來(lái)導(dǎo)入一個(gè)個(gè)的js文件這種方式已 經(jīng)不能滿足現(xiàn)在互聯(lián)網(wǎng)開發(fā)模式,我們需要團(tuán)隊(duì)協(xié)作、模塊復(fù) 用、單元測(cè)試等等一系列復(fù)雜的需求。于是requireJs等模塊化開發(fā)框架便應(yīng)運(yùn)而生。
模塊化可以讓我們更方便地使用別人的代碼,想要什么功能, 就加載什么模塊,但前提是大家必須以同樣的方式編寫模塊。目前, 通行的Javascript模塊規(guī)范共有兩種:CommonJS和AMD。
AMD是"Asynchronous Module Definition”的縮寫,意思 就是"異步模塊定義"。它采用異步方式加載模塊,模塊的加載不影 響它后面語(yǔ)句的運(yùn)行。所有依賴這個(gè)模塊的語(yǔ)句,都定義在一個(gè)回 調(diào)函數(shù)中,等到加載完成之后,這個(gè)回調(diào)函數(shù)才會(huì)運(yùn)行。
requireJs就是適用的AMD規(guī)范。
1. js加載的時(shí)候,瀏覽器會(huì)停止網(wǎng)頁(yè)渲染,加載文件越多,網(wǎng)頁(yè)失去響應(yīng)的時(shí)間就會(huì)越長(zhǎng);
2. 當(dāng)依賴關(guān)系很復(fù)雜的時(shí)候,代碼的編寫和維護(hù)都會(huì)變得困 難。
如果我們要執(zhí)行的js代碼是先執(zhí)行的話,那么在執(zhí)行alert時(shí), 瀏覽器中h1標(biāo)簽是看不到的,這就是JS阻塞瀏覽器渲染導(dǎo)致的 結(jié)果。
如果我們使用requireJs加載我們的彈窗的話,那么在瀏覽器中 h1標(biāo)簽是可以顯示的。所以require可以防止js加載時(shí)的阻止渲染問(wèn)題.
普通方式引入多個(gè)js非常麻煩,需要一個(gè)個(gè)的引入,而且還要按照他們之間的依賴順序進(jìn)行排列。 requirejs引入多個(gè)js則非常方便,只需要一行代碼就可以輕松搞定。
1. 實(shí)現(xiàn)js文件的異步加載,避免網(wǎng)頁(yè)失去響應(yīng);
2. 管理模塊之間的依賴性,便于代碼的編寫和維護(hù)。
但是require也是js,加載這個(gè)文件,也可能造成網(wǎng)頁(yè)失去響 應(yīng)。解決辦法有兩個(gè),一個(gè)是把它放在網(wǎng)頁(yè)底部加載,另一個(gè)是寫 成下面這樣:
加載require.js以后,需要加載自己的代碼,這里需要我們?cè)O(shè)置一個(gè)主模塊 main.js,意思是整個(gè)網(wǎng)頁(yè)的入口代碼。 主模塊要將所有的js文件連接到一起,需要require函數(shù)的支持。
在我們使用requireJs時(shí),我們主要會(huì)用到下面三個(gè)方法:
define() 用來(lái)定義一個(gè)模塊。
require() 用來(lái)加載依賴模塊,并執(zhí)行加載完后的回調(diào)函數(shù)。
require.config() 用來(lái)配置加載行為
require方法用于加載多個(gè)js文件,可以是本地文件,也可以是 網(wǎng)上文件,可以是具有依賴性的文件,也可以是非依賴性文件。 require()函數(shù)接受兩個(gè)參數(shù)。第一個(gè)參數(shù)是一個(gè)數(shù)組,表示所依賴的模塊,上例就是[“A”,”B”,”C”]。第二個(gè)參數(shù)是一個(gè)回調(diào)函數(shù),當(dāng)前面的ABC模塊都加載成功后,它將被調(diào)用。
ABC模塊會(huì)以參數(shù)形式傳入該函數(shù),所以回調(diào)函數(shù)的內(nèi)部可以使用這些模塊。 require()異步加載ABC模塊,瀏覽器不會(huì)失去響應(yīng);它指定的回調(diào)函數(shù),只有前面的模塊都加載成功后,才會(huì)運(yùn)行,解決了依賴性的問(wèn)題。
require.config()方法,可以讓我們對(duì)模塊的加載行為進(jìn)行自 定。它寫在主模塊的頭部,參數(shù)就是一個(gè)對(duì)象,通過(guò)對(duì)象的屬性 進(jìn)行各種設(shè)定。主要是用于對(duì)文件的加載路徑進(jìn)行設(shè)置。
paths屬性指定各個(gè)模塊的基于main文件的加載路徑,簡(jiǎn)單點(diǎn)說(shuō)就是給模塊起一個(gè)更短更好記的名字,文件后綴js是要省略的
baseUrl屬性指定模塊加載的基路徑(相對(duì)于index.html),然后paths會(huì)基于baseUrl相對(duì)加載路徑。
通過(guò)require加載的模塊一般都需要符合AMD規(guī)范即使用define來(lái)申明模塊,雖然已經(jīng)有很多流行的函數(shù)庫(kù)(比如 jQuery)符合AMD規(guī)范,但更多的庫(kù)并不符合,在我們需要加 載非AMD規(guī)范的js時(shí),就需要用到另一個(gè)功能:shim。
本文章視頻鏈接地址:http://blog.sina.com.cn/s/blog_1671244030102wxpm.html
更多精彩內(nèi)容請(qǐng)關(guān)注 ---- 微信公眾號(hào):houdunit
看完不要跑記得出來(lái)吐吐槽!╰( ̄▽ ̄)╮
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。