Webpack4.0 打包工具基本操作教程 小白篇

前言

我們在開發項目時,會用到很多的靜態資源,我們在瀏覽器,瀏覽網頁時,網頁加載的速度就會變慢,而且有很多的文件都是相互依賴的。

由於文章排版問題可能影響小闊愛的閱讀,具體完整版可以關注 微信公衆號小帥搜
在這裏插入圖片描述

總結

網頁加載速度慢, 因爲 我們要發起很多的二次請求

要處理錯綜複雜的依賴關係

如何解決

合併、壓縮、精靈圖、圖片的Base64編碼

requireJS、也可以使用webpack可以解決各個包之間的複雜依賴關係

webpack是什麼呢

webpack 是前端的一個項目構建工具,它是基於 Node.js 開發出來的一個前端工具

藉助於webpack這個前端自動化構建工具,可以完美實現資源的合併、打包、壓縮、混淆等諸多功能。

下圖:看左邊許多的文件,文件與文件之間又存在關係,經過webpack打包之後,就形成了右邊的樣子,文件少,還無依賴。

從圖中我們可以看出,Webpack 可以將多種靜態資源 js、css、less 轉換成一個靜態文件,減少了頁面的請求。

webpack中文網 https://www.webpackjs.com/

Webpack的安裝
運行npm i webpack -g全局安裝webpack,這樣就能在全局使用webpack的命令

在項目根目錄中運行npm i webpack --save-dev安裝到項目依賴中

項目初始化
創建如下目錄結構

初始化項目,會在項目的根目錄下生成一個package.json文件

npm init -y
安裝webpack和webpack-cli(webpack4.0以後需要單獨安裝)

npm install webpack webpack-cli --save-dev
安裝完成後,你會找到node_modules.bin\webpack

1

查看package.json文件

編寫index.js,簡單寫一句輸出語句即可

console.log(“ok”);
1

打包測試
輸入打包命令

webpack ./src/index.js -o ./dist/bundle.js
在webpack4.0以後,打包命令需要加-o,不然回報如下錯誤

1

成功,你會發現 dist 目錄下多了一個main.js的文件

在index.html中引入 dist 目錄下的main.js文件

1

打開瀏覽器後,運行index.html,F12打開控制檯,輸出ok就行

編寫webpack.config.js文件

const path = require(‘path’);

module.exports = {
// 配置入口(要打包的文件)
entry: path.join(__dirname, ‘./src/index.js’),
// 輸出文件相關配置
output: {
// 配置出口,指定打包好的文件存放路徑
path: path.join(__dirname, ‘./dist’),
// 要輸出的文件名
filename: ‘main.js’
},
mode: ‘development’
}

直接輸入webpack命令即可

你或許會遇見下面的黃色警告

黃色警告:是因爲webpack4引入了模式,有開發模式,生產模式,無這三個狀態

可以看到末尾並沒有生成我們所打包的main.js的信息

黃色部分的警告的意思是,沒有設置模式,有開發模式和生產模式兩種,

webpack.config.js添加屬性:mode: ‘development’

樣式的處理
普通CSS處理
首先在CSS目錄下新建一個index.css文件,寫點樣式

body {
background-color: green;
}
在index.js文件中,將css引入

import ‘./css/index.css’;
1

此時我們打包後,會報下面錯誤

You may need an appropriate loader to handle this file type,
currently no loaders are configured to process this file.
它的意思是說:沒有一個合適的加載器

這時我們需要安裝第三方loader加載器

css-loader:用於處理 css 文件,使得能在 js 文件中引入使用;

style-loader:用於將 css 文件注入到 index.html 中的

安裝命令

npm i style-loader css-loader --save-dev
webpack.config.js中,配置第三方匹配規則

// 配置第三方模塊
module: {
// 配置匹配規則
rules: [
{
test: /.css$/, // 匹配以後綴爲.css的文件
use: [‘style-loader’, ‘css-loader’]
}
]
}

test: 是一個正則表達式

use: 對應處理的 loader 插件名稱(處理順序是從右往左)

打包測試

可以看到樣式已經添加到

sass處理
在 css 目錄中,新建一個index.scss文件

body {
div {
width: 250px;
height: 250px;
border: 2px solid #000;
margin: 10px;
}
#a {
font-size: 20px;
}
#b {
color: red;
}
}

在index.html中,添加如下

aaaaaa
bbbbbb
1

2

index.js引入index.scss文件

import ‘./css/index.scss’;

安裝node-sass和sass-loader

npm i node-sass sass-loader --save-dev
1

webpack.config.js,配置module.rules匹配規則

{
test: /.scss$/,
use: [‘style-loader’, ‘css-loader’, ‘sass-loader’]
}

打包測試

打開F12後,已經成功了
(別問我爲什麼不截效果圖,因爲效果圖…好醜…)

ess處理
在 css 目錄中,新建一個index.less文件

body {
div {
color: #fff;
}
}
index.js引入index.less

import ‘./css/index.less’;
1

安裝less和less-loader

npm i less less-loader --save-dev
webpack.config.js中,配置module.rules匹配規則

{
test: /.less$/,
use: [‘style-loader’, ‘css-loader’, ‘less-loader’]
}
打包測試

F12查看,看得出來,成功了

開啓 SourceMap
先註釋掉這些東西

在index.js中

console.loo(“ok”);

別懷疑,對,就是console.loo(),很明顯,這個是一個錯誤的語句。

webpack.config.js中,開啓 source-map

module.exports = {
// …
devtool: ‘source-map’, // 開啓 source-map
// …
}
webpack.config.js中,module.rule 配置如下

rules: [
{
test: /.(sc|sa|le|c)ss$/,
use: [
“style-loader”,
{
loader: ‘css-loader’,
options: {sourceMap:true}
},
{
loader: ‘sass-loader’,
options: {sourceMap: true}
},
{
loader: ‘less-loader’,
options: {sourceMap: true}
}
]
}
]

打包測試,打包信息多了條信息,在dist目錄下,多了個main.js.map文件,這個文件裏面是映射的對應關係

可以發現,具體的報錯信息以及定位,一目瞭然

來看看CSS的

處理圖片
安裝url-loader和file-loader

npm i url-loader file-loader --save-dev
1

webpack.config.js中,配置module.rules

rules: [
{
test: /.(png|jpg|gif|bmp|jpeg)$/,
use: [‘url-loader’]
}
]
給頁面中#a添加一張背景圖

打包測試

查看元素,你會看到一串 Base64 的字符串

data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEB

FFFABRRRQB/9k=

關於url-loader的一些參數

use: [‘url-loader?limit=53251&name=[hash:8]-name.ext’]
1

limit:當圖片大小,大於指定字節數時,就不會轉爲base64字符串

安裝 webpack-dev-server
作用:我們每次只要把文件修改一下,就需要進行重新打包,這樣非常麻煩,而webpack-dev-server就是爲此誕生的。

安裝

npm i webpack-dev-server --save-dev
打開package.json,配置scripts,如下

“scripts”: {
// …
“webpack-dev-server”: “webpack-dev-server”
// …
},
key可以隨意,你可以直接寫成dev,我這樣寫,也僅僅只是隨便記住這個單詞,哈哈。

運行

npm run webpack-dev-server
你會看到這兩條信息

i 「wds」: Project is running at http://localhost:8080/
i 「wds」: webpack output is served from /

第一條:項目運行地址

第二條:輸出文件的位置在/下,也就是項目根目錄下

修改index.js中的代碼,重新刷新瀏覽器(不用重新打包),也發現沒有任何效果,那是因爲輸出文件被放到項目根目錄下了
修改main.js引入路徑

修改webpack-dev-server配置

“scripts”: {
// …
“webpack-dev-server”: “webpack-dev-server --open --port 8888 --contentBase src --hot”
// …
},

open:自動打開瀏覽器

port:修改端口號

contentBase:指定項目運行根目錄

hot:啓用熱更新

修改完成後,重新打包即可看到效果

webpack-dev-server的第二種配置方式(瞭解)

webpack.config.js中,module.exports 配置屬性

devServer: {
open: true,
port: 8888,
contentBase: ‘src’,
hot: true // 啓用熱更新的第一步
}

啓用熱更新第二步,webpack.config.js中,頂部引入
const webpack = require(‘webpack’);
啓用熱更新第三步,webpack.config.js中,module.exports配置屬性
plugins: [
// 創建熱更新的模板對象
new webpack.HotModuleReplacementPlugin()
]
JavaScript 處理
有些時候,我們寫的ES6代碼,瀏覽器並不支持,所以需要將ES6的代碼,轉爲更低級的,瀏覽器可以識別的。

index.js編寫一段ES6代碼

class Person {
static info = {
name: ‘小靈’,
age: 17
}
}
console.log(Person.info);
安裝相關包

cnpm i babel-loader @babel/core @babel/preset-env -D
cnpm i @babel/plugin-proposal-class-properties -D
webpack.config.js配置如下,配置module.rules

rules: [
{
test: /.js$/,
use: {
loader: ‘babel-loader’,
options: {
presets: [’@babel/preset-env’],
plugins: [’@babel/plugin-proposal-class-properties’]
}
},
exclude: /node_modules/
}
]

options這一塊可以移到項目根目錄的.babelrc文件

{
“presets”: ["@babel/env"],
“plugins”: ["@babel/proposal-class-properties"]
}
執行 npm run webpack-dev-server

vue 組件處理
安裝vue-loader和vue-template-compiler

cnpm i vue vue-loader vue-template-compiler -D
index.js導入Vue

import Vue from ‘vue’;
因爲導入的Vue,功能不完善,只提供了 runtime-only 的方式,默認是導入dist/vue.runtime.common.js的,所以需要修改一下

直接修改路徑

import Vue from ‘…/node_modules/vue/dist/vue.js’

也可以在webpack.config.js中添加如下(推薦)

module.exports = {
// …
resolve: {
alias: {
“vue$”: “vue/dist/vue.js”
}
}
// …
}

webpack.config.js中,在 vue-loader 15.* 之後,要添加如下

const vueLoaderPlugin = require(‘vue-loader/lib/plugin’);
webpack.config.js中,plugins 配置如下

module.exports = {
// …
plugins: [
new vueLoaderPlugin()
]
// …
}

創建App.vue組件
注意:在.vue組件中,只能有、

App 組件

​ ​ ​ webpack.config.js中,module.rules 配置屬性

rules: [
{test: /.vue/, use: ‘vue-loader’}
]
index.html添加如下

導入index.js中導入App.vue組件

import App from ‘./js/App.vue’;
index.js中,創建Vue實例對象

var vm = new Vue({
el: ‘#app’,
render: function(createElements) {
return createElements(App);
}
});
[Vue warn]: Cannot find element: #app

是因爲頁面還沒加載完,所以找不到此元素,我們直接把

路由 router
安裝vue-router

cnpm i vue-router -D
index.js如下

import Vue from ‘vue’;
import VueRouter from ‘vue-router’
// 手動安裝 VueRouter
Vue.use(VueRouter);

// 導入 login 組件
import login from ‘./js/login.vue’

// 創建路由對象
var router = new VueRouter({
routes: [
{path: ‘/login’, component: login}
]
});

var vm = new Vue({
el: ‘#app’,
render: els => els(App),
router
});

export default 和 export
ES6中的導入和導出
導入:

import 模塊名稱 from 模塊標識符

import 路徑

導出:

export default

export

注意:

export default 此方式導出,外部可以使用任意變量接收

export default 同一個模塊中,只允許導出一次

export 此方式導出,外部必須嚴格按照導出的指定的變量名接收

export 外部使用 { 導出的變量名, … } 的形式接收

export 外部可以設置別名:{ 導出的變量名 as 別名, … }

Node的導入和導出
導入:

var 名稱 = require(模塊標識符)

導出:

module.exports

exports

組件中style標籤的 lang 屬性 和 scope 屬性
lang:指定CSS的語言,可以是sacc,scss,less等

scope:不寫,則默認樣式爲全局,反之則局部,它的原理是利用屬性選擇器

html-webpack-plugin 插件
安裝

cnpm i html-webpack-plugin -D
webpack.config.js引入

const htmlWebpackPlugin = require(‘html-webpack-plugin’);

webpack.config.js,module.plugins配置如下

plugins: [
// 在內存中生成一個 HTML 插件
new htmlWebpackPlugin({
// 指定模板頁面
template: path.join(__dirname, ‘./src/index.html’),
// 指定生成的文件名
filename: ‘index.html’
})
],
打包測試之後,在瀏覽器中,控制檯中,會發現有以VM開頭的文件

import找包的規則:

找項目根目錄中有沒有node_modules的文件夾

在node_modules 中根據包名,找對應的文件夾

在文件夾中,找到一個叫做 package.json 的包配置文件

在package.json中,找到main屬性,屬性值是這個包在被加載時的入口文件

–save 可以簡寫爲-S, --save-dev可以簡寫爲-D

掃描二維碼

獲取更多精彩

小帥搜

往期推薦

Linux系統下添加硬盤和分區詳細教程

9.)PHPWeb開發框架~Laravel入門路由配置和使用規則介紹

10.)PHPWeb開發框架~Laravel自帶php artisan 命令行接口集合列表

11.)PHPWeb開發框架~Laravel開發環境安裝配置與要求

12.)PHPWeb開發框架~使用composer安裝Laravel框架踩坑記錄(附解決方案)

14.)PHPWeb開發框架~Laravel接收用戶的輸入的類

看都看完了,還不點這裏試試

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章