目錄
樣式載入器
你必須大罵它
圖片
預載器
准备生产
摘要
首頁 web前端 js教程 加深對 Webpack 的理解:第 2 部分

加深對 Webpack 的理解:第 2 部分

Sep 06, 2023 pm 04:17 PM

加深对 Webpack 的理解:第 2 部分

在先前的教學課程中,我們學習如何設定 Webpack 專案以及如何使用載入器來處理 JavaScript。不過,Webpack 真正的亮點在於它能夠捆綁其他類型的靜態資源(例如 CSS 和圖像),並僅在需要時將它們包含在我們的專案中。讓我們先為頁面添加一些樣式。

樣式載入器

首先,在 styles 目錄中建立一個普通的 CSS 檔案。呼叫 main.css 並為標題元素新增樣式規則。

h2 {
    background: blue;
    color: yellow;
}
登入後複製

那麼我們要如何將此樣式表放入我們的頁面中呢?好吧,就像 Webpack 的大多數事情一樣,我們需要另一個載入器。事實上有兩個:css-loader 和 style-loader。第一個從我們的 CSS 文件中讀取所有樣式,而另一個將所述樣式註入到我們的 HTML 頁面中。像這樣安裝它們:

npm install style-loader css-loader
登入後複製

接下來,我們告訴 Webpack 如何使用它們。在 webpack.config.js 中,我們需要在 loaders 陣列中新增另一個物件。在其中,我們要新增一個測試以僅符合 CSS 檔案並指定要使用的載入器。

{
    test: /\.css$/,
    exclude: /node_modules/,
    loader: 'style!css'
}
登入後複製

此程式碼片段中有趣的部分是 'style!css' 行。載入器是從右向左讀取的,因此這告訴 Webpack 首先讀取以 .css 結尾的任何檔案的樣式,然後將這些樣式註入到我們的頁面中。

因為我們已經更新了設定文件,所以我們需要重新啟動開發伺服器才能使更改生效。使用 ctrl c 停止伺服器並使用 webpack-dev-server 重新啟動伺服器。

我們現在需要做的就是從 main.js 檔案中取得樣式表。我們這樣做的方式與任何其他 JavaScript 模組相同:

const sayHello = require('./say-hello');

require('./styles/main.css');

sayHello('Guybrush', document.querySelector('h2'));
登入後複製

注意我們甚至沒有觸及index.html。開啟瀏覽器即可看到樣式為 h2 的頁面。更改樣式表中標題的顏色即可立即更新,無需刷新。可愛。

你必須大罵它

「但現在沒有人使用 CSS,爺爺!這一切都是關於 Sass 的」。當然如此。幸運的是,Webpack 有一個載入器可以完成這件事。使用以下命令將其與 Sass 的節點版本一起安裝:

npm install sass-loader node-sass
登入後複製

然後更新webpack.config.js

{
    test: /\.scss$/,
    exclude: /node_modules/,
    loader: 'style!css!sass'
}
登入後複製

現在的意思是,對於任何以 .scss 結尾的文件,將 Sass 轉換為純 CSS,從 CSS 中讀取樣式,然後將樣式插入到頁面中。請記得將 main.css 重新命名為 main.scss,並需要新命名的檔案。首先是一些 Sass:

$background: blue;

h2 {
    background: $background;
    color: yellow;
}
登入後複製

然後是main.js:

require('./styles/main.scss');
登入後複製

超級。就這麼簡單。無需轉換和保存文件,甚至無需查看資料夾。我們只需要直接輸入 Sass 樣式。

圖片

「那我敢打賭,圖片、裝載機也是如此?」當然!對於圖像,我們要使用 url-loader。此載入程式會取得影像的相對 URL 並更新路徑,以便將其正確包含在您的檔案包中。像往常一樣:

npm install url-loader
登入後複製

現在,讓我們在 webpack.config.js 中嘗試一些不同的東西。以通常的方式為 loaders 數組添加另一個條目,但這次我們希望正規表示式能夠匹配具有不同檔案副檔名的圖像:

{
    test: /\.(jpg|png|gif)$/,
    include: /images/,
    loader: 'url'
}
登入後複製

請注意此處的另一個差異。我們沒有使用 exclude 鍵。相反,我們使用 include。這更有效,因為它告訴 webpack 忽略與名為「images」的資料夾不匹配的所有內容。

通常您會使用某種模板系統來建立 HTML 視圖,但我們將保持其基本性並以老式方式在 JavaScript 中建立圖像標記。首先建立一個image元素,將所需的圖片設定到src屬性中,然後將該元素加入到頁面中。

var imgElement = document.createElement('img');

imgElement.src = require('./images/my-image.jpg');

document.body.appendChild(imgElement);
登入後複製

返回瀏覽器,您的圖像就出現在您的眼前!

預載器

開發過程中經常執行的另一個任務是 linting。 Linting 是一種尋找程式碼中潛在錯誤以及檢查您是否遵循某些編碼約定的方法。您可能想要查找的內容是「我是否在沒有先聲明的情況下使用了變數?」或者「我忘記了行尾的分號嗎?」透過執行這些規則,我們可以儘早清除愚蠢的錯誤。

JSHint 是一种流行的 linting 工具。这会检查我们的代码并突出显示我们所犯的潜在错误。 JSHint 可以在命令行手动运行,但这很快就会成为开发过程中的一件苦差事。理想情况下,我们希望它在每次保存文件时自动运行。我们的 Webpack 服务器已经在留意变化,所以是的,你猜对了——另一个加载器。

按照通常的方式安装jshint-loader:

 npm install jshint-loader
登入後複製

我们必须再次将其添加到我们的 webpack.config.js 中来告诉 Webpack 使用它。然而,这个加载器略有不同。它实际上并没有转换任何代码——只是看看。我们也不希望所有较重的代码修改加载器仅仅因为忘记了分号而运行并失败。这就是预加载器的用武之地。预加载器是我们指定在主要任务之前运行的任何加载器。它们以与加载器类似的方式添加到我们的 webpack.conf.js 中。

module: {
    preLoaders: [
        {
            test: /\.js$/,
            exclude: /node_modules/,
            loader: 'jshint'
        }
    ],
    loaders: [
       ...    
    ]
}
登入後複製

现在,如果检测到问题,我们的 linting 过程会立即运行并失败。在重新启动 Web 服务器之前,我们需要告诉 JSHint 我们正在使用 ES6,否则当它看到我们正在使用的 const 关键字时将会失败。

在配置中的模块键之后,添加另一个名为“jshint”的条目和一行来指定 JavaScript 的版本。

module: {
    preLoaders: [
        ...
    ],
    loaders: [
        ...    
    ]
},
jshint: {
    esversion: 6
}
登入後複製

保存文件并重新启动webpack-dev-server。运行还好吗?伟大的。这意味着您的代码不包含错误。让我们通过删除这一行中的分号来介绍一个:

var imgElement = document.createElement('img')
登入後複製

再次保存文件并查看终端。现在我们得到了这个:

WARNING in ./main.js
jshint results in errors
  Missing semicolon. @ line 7 char 47
登入後複製

谢谢,JSHint!

准备生产

现在我们很高兴我们的代码已经成型并且它完成了我们想要的一切,我们需要为现实世界做好准备。上线代码时最常见的事情之一就是缩小代码,将所有文件连接成一个,然后将其压缩到尽可能小的文件中。在继续之前,请查看您当前的 bundle.js。它可读,有大量空白,大小为 32kb。

“等等!别告诉我。另一个装载机,对吧?”没有!在这种罕见的情况下,我们不需要装载机。 Webpack 内置了缩小功能。一旦您对代码感到满意,只需运行以下命令:

webpack -p
登入後複製

-p 标志告诉 Webpack 让我们的代码为生产做好准备。当它生成捆绑包时,它会尽可能地进行优化。运行此命令后,打开 bundle.js,您会看到它全部被压缩在一起,即使使用如此少量的代码,我们也节省了 10kb。

摘要

我希望这个由两部分组成的教程能让您有足够的信心在自己的项目中使用 Webpack。请记住,如果您想在构建过程中执行某些操作,那么 Webpack 很可能有一个加载器。所有加载器都是通过 npm 安装的,因此请查看那里是否有人已经制作了您需要的内容。

玩得开心!

以上是加深對 Webpack 的理解:第 2 部分的詳細內容。更多資訊請關注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)

前端熱敏紙小票打印遇到亂碼問題怎麼辦? 前端熱敏紙小票打印遇到亂碼問題怎麼辦? Apr 04, 2025 pm 02:42 PM

前端熱敏紙小票打印的常見問題與解決方案在前端開發中,小票打印是一個常見的需求。然而,很多開發者在實...

神秘的JavaScript:它的作用以及為什麼重要 神秘的JavaScript:它的作用以及為什麼重要 Apr 09, 2025 am 12:07 AM

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

誰得到更多的Python或JavaScript? 誰得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

Python和JavaScript開發者的薪資沒有絕對的高低,具體取決於技能和行業需求。 1.Python在數據科學和機器學習領域可能薪資更高。 2.JavaScript在前端和全棧開發中需求大,薪資也可觀。 3.影響因素包括經驗、地理位置、公司規模和特定技能。

如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? 如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? Apr 04, 2025 pm 05:09 PM

如何在JavaScript中將具有相同ID的數組元素合併到一個對像中?在處理數據時,我們常常會遇到需要將具有相同ID�...

JavaScript難以學習嗎? JavaScript難以學習嗎? Apr 03, 2025 am 12:20 AM

學習JavaScript不難,但有挑戰。 1)理解基礎概念如變量、數據類型、函數等。 2)掌握異步編程,通過事件循環實現。 3)使用DOM操作和Promise處理異步請求。 4)避免常見錯誤,使用調試技巧。 5)優化性能,遵循最佳實踐。

如何實現視差滾動和元素動畫效果,像資生堂官網那樣?
或者:
怎樣才能像資生堂官網一樣,實現頁面滾動伴隨的動畫效果? 如何實現視差滾動和元素動畫效果,像資生堂官網那樣? 或者: 怎樣才能像資生堂官網一樣,實現頁面滾動伴隨的動畫效果? Apr 04, 2025 pm 05:36 PM

實現視差滾動和元素動畫效果的探討本文將探討如何實現類似資生堂官網(https://www.shiseido.co.jp/sb/wonderland/)中�...

JavaScript的演變:當前的趨勢和未來前景 JavaScript的演變:當前的趨勢和未來前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

console.log輸出結果差異:兩次調用為何不同? console.log輸出結果差異:兩次調用為何不同? Apr 04, 2025 pm 05:12 PM

深入探討console.log輸出差異的根源本文將分析一段代碼中console.log函數輸出結果的差異,並解釋其背後的原因。 �...

See all articles