A. web前端打包報錯 webpack 打包成功但是會報錯 怎麼解決
web前端打包報錯 webpack 打包成功但是會報錯解決方法如下:
1.具體看日誌:This is most likely a problem with the SHOP.BM package。
2.另外,可以把node環境版本升級到新版本
B. 前端構建工具webpack有什麼缺陷
1.文檔缺失,尤其中文文檔
長期以來webpack官方文檔和example匱乏,提供的一些例子都是很簡單那種,經常發現完全按照例子來配置但就是跑不起來,中文文檔就更不用說了,少的可憐。這個問題也直接導致下面的第2點。
2.配置難&難調試
稍微復雜一點的項目,如果使用webpack編譯,不經過一段痛苦不堪的配置調試過程是沒法正常跑起來的。這還沒完,在自己機器上跑起來之後可能到了另一個同事哪兒又報錯了等等。總之正如下面有人回答那樣,配置文件一旦跑起來,是根本不敢去改的,生怕又出錯。
webpack的錯誤提示也非常難看懂,基本不可能從錯誤很直觀的找到原因,長期以來碰到問題只能靠猜,你沒看錯,就是靠猜!!
3.編譯慢
經驗不足的同學很容易碰到這個問題,當然可以通過一些手段做優化,比如配置mole的resolve、root等,使用happypack加速、dll提前編譯等等。但是筆者曾經嘗試過happypack,對編譯速度有提升但效果不明顯,dll的話我有按照官方文檔的做法去做,但是最終編譯出來又報了一些莫名其妙的錯(也有可能是代碼寫的有問題),總之心累,後來直接改成externals方式,全局script引入第三方庫。
4.對server-render不友好
webpack本質上還是靜態打包,意思就是打包完成之後其實文件的載入順序已經固定,只是被載入的時間不定而已。所以使用webpack原則上不存在按需載入之類的說法,code split其實是人工分隔,但是真實的按需載入場景豈是人工能枚舉完的 (下劃線這句話不太好解釋,也不想過多解釋,熟悉前端工程的人應該都明白啥意思)。
在這里我要說的對server-render不友好其實是指html的處理,webpack其實是通過在js里用require標記資源然後載入任意資源(css、圖片、fonts等等),但其實html文件才是頁面真實的入口,最終編譯出的js還是需要引入到html里,為了防止css懶載入導致頁面抖動,編譯完的css還需要從js里邊提取出來放到html外鏈。
目前一般都是通過html-webpack-plugin來做這個事情,先搜集某個html所引用的靜態資源最終自動插入到html。這種方式對於前端渲染的應用沒有問題,但是對於server-render的那就不行了,因為server-render下html是作為模板由後端語言吐出,而開發模式下(例如webpack-dev-server)webpack是不會輸出任何文件的(開發環境webpack是將文件放到內存然後在路由層自動serve了),所以這會導致開發環境模板無法引用靜態資源。當然,有一種解決方案就是靜態資源不改變文件名稱,預先寫好路徑,開發環境和生產環境同名(即覆蓋式發布)。
C. web前端打包工具有哪些
工具很多,目前常用的是webpack, grunt等,在沒出現更好的工具之前,學好這兩個其中的一個基本都夠用了。
D. webpack打包後的代碼,如何部署到伺服器上
本文章前端代碼是基於vue+webpack開發的
Nginx是一款輕量級的Web 伺服器/反向代理伺服器
首先,webpack配置如下
在開發過程中,我們是通過npm run dev在開發環境中運行代碼
如果要部署到生產環境中,可以運行npm run build進行上線打包
打包完成後,會發現項目中多了dist這個文件夾
執行結果和webpack的配置文件一致。
代碼被webpack打包完成後下一步就是部署到伺服器上,此文僅適合於前端代碼是部署在windows操作系統的nginx服務中。
這里假設:
Windows操作系統:windows server 2008 64位
Nginx服務:nginx-1.12.2 64位
1.下載nginx-1.12.2 64位解壓,假設nginx-1.12.2放在D:nginx-1.12.2目錄中,nginx目錄結構。如圖下
2、前端代碼放在D:nginx-1.12.2html目錄中,dist目錄就是剛剛前端打包完的代碼。如圖下
3、在D:nginx-1.12.2conf目錄中,有個nginx.conf配置文件,進行編輯這個文件
4、假設前端的埠號為8082,如果埠號被佔用,請修改為其它埠號。後台服務訪問地址http://192.168.121.**:8080,
5、打開cmd控制台,進入目錄D:nginx-1.12.2中,用start nginx命令啟動服務,然後用tasklist /fi "imagename eq nginx.exe",查看nginx服務是否啟動。
4、如果改變配置文件時,需要用nginx -s reload 命令重啟nginx工作進程。
5、關閉服務
nginx -s stop
nginx -s quit 安全關閉
taskkill /F /IM nginx.exe > nul 關閉所有nginx服務
E. 如何用webpack實現自動化的前端構建工作流
1.首先 git clonehttps://github.com/bjtqti/font-end-boilerplate.git 一份到本地
2.然後 npm install && npm run start
3. 最後打開瀏覽器,運行http://localhost:4000
5.解析一下這些目錄的用途:
|- dist下面存放發布的js、css 文件 (自動生成)
|- node_moles 下面是npm安裝的包文件 (自動創建)
|- src 存放具體的業務代碼
|- task 存放webpack的配置代碼
|- task
|- webpack.api.conf.js 用於webpack的api方式的配置文件 server.js用到
|- webpack.dev.conf.js 用於CLI方式使用webpack 的配置
|- webpack.prod.conf.js 用於生產環境打包輸出的配置
|- .postcssrc.js post-loader的插件配置文件,由於後面用了postcss.config.js所以重命名了這個
|- .babelrc babel的配置文件,為了解析es6語法
|- .gitignore git的配置,指出要不參與版本控制的文件及文件夾
|- .package.json 包配置文件
|- postcss.config.js post-loader配置
|- README.md github.com自動創建的項目說明文件
|- server.js 本地開發調式用的web伺服器
需要重點掌握的是package.json 其次是server.js 和 task相關的配置內容
先看看package.json:
{
"name": "shop",
"version": "1.0.0",
"description": "webapp frontend shop",
"main": "index.js",
"scripts": {
"start": "node server.js",
"dev": "webpack-dev-server --config ./task/webpack.dev.conf.js",
"build": "webpack --config ./task/webpack.prod.conf.js",
"test": "echo "Error: no test specified" && exit 1"
},
"keywords": [
"mall",
"shop"
],
"author": "frog",
"repository": "https://github.com/bjtqti/font-end-boilerplate.git",
"license": "MIT",
"devDependencies": {
"babel-core": "^6.25.0",
"babel-loader": "^7.1.1",
"babel-plugin-transform-runtime": "^6.23.0",
"babel-preset-env": "^1.5.2",
"css-loader": "^0.28.4",
"express": "^4.15.3",
"extract-text-webpack-plugin": "^2.1.2",
"html-webpack-plugin": "^2.29.0",
"postcss-loader": "^2.0.6",
"style-loader": "^0.18.2",
"webpack": "^2.6.1",
"webpack-dev-middleware": "^1.11.0",
"webpack-dev-server": "^2.5.0",
"webpack-hot-middleware": "^2.18.0"
},
"dependencies": {
"babel-plugin-transform-runtime": "^6.15.0"
}
}
這個文件其實就是一個json對象,里邊重點掌scripts 的用法。比如start:node server.js 對應 npm run start (或 npm start) 這條命令就相當於是在node環境下運行了server.js
那麼server.js(文件名可以自已定)里邊保存了一些什麼內容?
var express = require("express");
var webpack = require("webpack");
var path = require('path')
var app = express();
var webpackConfig = require("./task/webpack.api.conf.js");
var compiler = webpack(webpackConfig);
var devMiddleware = require('webpack-dev-middleware')(compiler, {
contentBase: webpackConfig.output.path,
publicPath: webpackConfig.output.publicPath,
//hot: true,
//stats: { colors: true },
quiet: true
})
var hotMiddleware = require('webpack-hot-middleware')(compiler, {
//lazy: true,
//path:'/hmr',
log: () => {}
})
app.use(express.static('./dist'));
app.use(hotMiddleware)
app.use(devMiddleware)
app.listen(4000, function () {
console.log("Listening on port 4000!");
});
其實就是使用了express來搭建一個小型的開發伺服器。然後引用webpack-dev-middleware和webpack-hot-middleware兩個中間件,結合webpack.api.conf.js的配置,實現打包和熱載入src下面的代碼。由於這里涉及到express的知識,不打算涉及全棧的前端只需了解一下即可,因為後面還有一個封裝好的工具可以替代這些工作--webpack-dev-server
所以我在script中添加了一個dev:webpack-dev-server 的命令,這全完是為了方便學習這兩種方式的應用,實際上任選其中一種就好了,這一種可能會感覺更簡單,因為它是第一種方式的封裝,但是要深入的了解,還是建議看看第一種方式,Vue-cli也是採用的第一方式,因為它可供開發者自由支配的空間更大。唯一需要注意的是,如果使用webpack-dev-server的話,目前還不能用webpack3.0+。
接下來運行npm run build 看看,dist目錄下是不是多了一些文件?這就是將來可以直接發布到線上的代碼了。
到這里,打包,發布 都介紹完了,下面簡單演示一下熱替換(也就是所謂的無刷新替換效果)。為了演示方便,我在src下放了一些代碼.
當我們打開http://localhost:4000的時候,瀏覽器上有一段綠色的文字:Hello world 還有一個時間毫秒數,加這個毫數的目的是為了演示,如果頁面刷新了,數字會改變。
然後修改style.css中的內容,比如把字體顏色改成紅色,瀏覽器上的字體顏色也相應的變化了,而數字沒有發生改變。如果手動刷新的話,可以看到數字是會變化的。
這不僅會節省時間,而且對於要保存頁面狀態(比如某按鈕選中)的情況非常有用。當我們修改hello.es6的時候,頁面變成了自動刷新,這是因為我沒有使用js的熱替換載入器。
如果對html的修改,也想要自動刷新的話,需要用到插件,發出相應的事件。比如vue-cli中的方式:
// force page reload when html-webpack-plugin template changes
compiler.plugin('compilation', function (compilation) {
compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) {
hotMiddleware.publish({ action: 'reload' })
cb()
})
})
這里只是發出一個通知:action:'reload',要使頁面自動重新載入,還需要有一個接收通知的代碼:
比如在入口中加入:
/* eslint-disable */
require('eventsource-polyfill')
var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true')
hotClient.subscribe(function (event) {
if (event.action === 'reload') {
window.location.reload()
}
})
這個地方比較深奧,沒有弄明白也沒關系,有其它方式同樣可以實現。比如webpack-dev-server 內部已經自動完成了對不支持熱替換的載入器,自動降為刷新。
這也是為什麼在開發環境下使用了extract-text-webpack-plugin(提取css的插件)後,樣式的熱替換變成了刷新效果的原因。
F. 【Web前端基礎】webpack打包原理是什麼
【Web前端基礎】webpack打包原理是什麼?1、概念
本質上,webpack 基於node平台,利用 node 的各種api來實現 javascript 應用程序的一個靜態模塊的打包工具。
在打包過程中,構建依賴關系,並且實現模塊引用預處理,以及緩存等。
2、分析
1、人口文件
// mian.js
const a = require('./m1')
const b= require('./m2')
import { test } from './m1'
console.log(test)
//m2.js
export default {
b:2
}
//m1.js
export const test = {test:1}
export default {
a:1
}
2、生產的文件
(function (moles) {
var installedMoles = {}; //緩存
/*
* 載入模塊函數
* 傳入模塊id
* */
function __webpack_require__(moleId) {
// 檢查緩存中是否有模塊
if (installedMoles[moleId]) {
return installedMoles[moleId].exports;
}
// 創建一個新模塊,並緩存起來
var mole = installedMoles[moleId] = {
i: moleId,
l: false,
exports: {}
};
// 調模塊的函數,moles
moles[moleId].call(mole.exports, mole, mole.exports, __webpack_require__);
mole.l = true;
// 返回對應模塊
return mole.exports;
}
__webpack_require__.m = moles;
__webpack_require__.c = installedMoles;
__webpack_require__.d = function (exports, name, getter) {
if (!__webpack_require__.o(exports, name)) {
Object.defineProperty(exports, name, {
configurable: false,
enumerable: true,
get: getter
});
}
};
__webpack_require__.n = function (mole) {
var getter = mole && mole.__esMole ?
function getDefault() {
return mole['default'];
} :
function getMoleExports() {
return mole;
};
__webpack_require__.d(getter, 'a', getter);
return getter;
};
__webpack_require__.o = function (object, property) {
return Object.prototype.hasOwnProperty.call(object, property);
};
__webpack_require__.p = "";
// 載入入口文件
return __webpack_require__(__webpack_require__.s = 0);
})
([
(function (mole, exports, __webpack_require__) {
const a = __webpack_require__(1)
const b = __webpack_require__(2)
}),
(function (mole, __webpack_exports__, __webpack_require__) {
"use strict";
Object.defineProperty(__webpack_exports__, "__esMole", {value: true});
__webpack_exports__["default"] = ({
a: 1
});
}),
(function (mole, __webpack_exports__, __webpack_require__) {
"use strict";
Object.defineProperty(__webpack_exports__, "__esMole", {value: true});
__webpack_exports__["default"] = ({
b: 2
});
})
]);
觀察以上代碼得到結果:
1、打包後的代碼是一個立即執行函數,且傳入的參數為一個數組
2、參數數組就是我們引用的模塊
3、每一個模塊對應著數組的位置就是那麼的id
4、在立即函數中載入入口文件,並執行
__webpack_require__ : 載入並執行某一個模塊並將模塊緩存在 installedMoles 中。
moles[moleId].call(mole.exports, mole, mole.exports, __webpack_require__);
這里是執行引用的某一個模塊。
並將mole,exports,require 加入模塊中。
這也是為什麼我們在模塊中有全局變數 mole/exports/require
通過對打包後的文件分析,基本可以完全理解打包過程。
G. webpack打包原理
webpack打包原理是根據文件間的依賴關系對其進行靜態分析,然後將這些模塊按指定規則生成靜態資源,當 webpack 處理程序時,它會遞歸地構建一個依賴關系圖(dependency graph),其中包含應用程序需要的每個模塊,然後將所有這些模塊打包成一個或多個 bundle。
webpack有兩種組織模塊的依賴方式,同步、非同步。非同步依賴將作為分割點,形成一個新的塊;在優化了依賴樹之後,每一個非同步區塊都將作為一個文件被打包。
webpack有一個智能解析器,幾乎可以處理任何第三方庫。無論它們的模塊形式是CommonJS、AMD還是普通的JS文件;甚至在載入依賴的時候,允許使用動態表require("、/templates/"+name+"、jade")。
(7)前端打包基於webpack擴展閱讀
在使用webpack構建的典型應用程序或站點中,有三種主要的代碼類型:
1、團隊編寫的源碼。
2、源碼會依賴的任何第三方的library或"vendor"代碼。
3、webpack的runtime和manifest,管理所有模塊的交互。
runtime 包含:在模塊交互時,連接模塊所需的載入和解析邏輯;包括瀏覽器中的已載入模塊的連接,以及懶載入模塊的執行邏輯。
H. 如何用webpack打包一個網站應用
隨著前端技術的發展,越來越多新名詞出現在我們眼前。angularjs、react、gulp、webpack、es6、babel……新技術出現,讓我們了解了解用起來吧!今天我來介紹一下如何用webpack打包一個網頁應用。
一般我們寫頁面,大概都是這樣的結構:
index.html
css
style.css
js
index.js
...........
這樣我們的html里直接引用css和js,完成一個網頁應用。用webpack也類似,只是webpack把圖片、css和js都編譯打包成一個文件,我們只需要引用一個文件就可以了。
1.我們需要先安裝node環境。沒安裝的請自行安裝
2.在項目目錄下輸入npm init初始化一個node項目,輸入項目名稱等信息,完成後生成一個package.json文件。
3.在項目目錄下安裝webpack
npm install --save-dev webpack
4.我們需要一個webpack.config.js文件,記錄webpack配置信息。它的配置大概這樣:
var webpack = require('webpack');
var path = require('path');
var buildPath = path.resolve(__dirname, 'build');
var config = {
//入口文件
entry: {
index : './src/js/index.js'
},
extensions: ['', '.js', '.json', '.css', '.less'],
output: {
path: buildPath, //編譯後的文件路徑
filename: 'app.js'
},
mole: {
//Loaders
loaders: [
//.css 文件使用 style-loader 和 css-loader 來處理
{ test: /\.css$/, loader: 'style-loader!css-loader' },
{ test: /\.less$/,
loader: 'style-loader!css-loader!less-loader'
},
//.js 文件使用 babel 來編譯處理
{ test: /\.js$/, loader: 'babel' },
//圖片文件使用 url-loader 來處理,小於8kb的直接轉為base64
{ test: /\.(png|jpg)$/, loader: 'url-loader?limit=8192'}
]
},
};
mole.exports = config;
我們需要指定編譯的入口文件和輸出的目錄路徑,以及css和js用什麼loader處理,比如我使用了less,要編譯less文件,就指定less-loader,js我要用es6來寫,為了兼容性,用babel來轉成es5的代碼。如果要使用react,也可以指定jsx等的編譯方式。
5.這些loader都是需要npm安裝的
npm install --save-dev css-loader less less-loader style-loader url-loader babel babel-core babel-loader babel-preset-es2015
6.如果需要用babel,在項目目錄下新建一個名為.babelrc的隱藏文件,裡面這樣寫:
{"presets":["es2015"]}
保存。
7.根據配置可以看到我們需要一個src文件夾和一個build文件夾,src放圖片、css和js的源代碼,build作為輸出文件夾放編譯後的文件。
8.src/js/index.js文件作為我們的入口文件,我們在裡面可以愉快地寫es6的代碼,比如:
'use strict';
require('../css/base.css');
require('../css/animate.css');
require('../css/style.less');
require('../js/zepto.min.js');
let a = 'world';
let hello = `hello ${a}`;
console.log(hello);
可以看到css我們都通過require的方式引進來,這樣webpack會把css和js打包進一個文件。
9.我們還差個index.html,放在項目文件夾下就可以,正常寫,引入build/app.js就可以啦!
10.讓我們試試吧
I. gulp+webpack怎麼實現前端模塊化
gulp是前端開發過程中對代碼進行構建的工具,是自動化項目的構建利器;她不僅能對網站資源進行優化,而且在開發過程中很多重復的任務能夠使用正確的工具自動完成;使用她,我們不僅可以很愉快的編寫代碼,而且大大提高我們的工作效率。
gulp是基於Nodejs的自動任務運行器, 她能自動化地完成
javascript/coffee/sass/less/html/image/css
等文件的的測試、檢查、合並、壓縮、格式化、瀏覽器自動刷新、部署文件生成,並監聽文件在改動後重復指定的這些步驟。在實現上,她借鑒了Unix操作系統的管道(pipe)思想,前一級的輸出,直接變成後一級的輸入,使得在操作上非常簡單。通過本文,我們將學習如何使用Gulp來改變開發流程,從而使開發更加快速高效。
gulp 和 grunt 非常類似,但相比於 grunt 的頻繁 IO 操作,gulp 的流操作,能更快地更便捷地完成構建工作。
webpack
Webpack 是當下最熱門的前端資源模塊化管理和打包工具。它可以將許多鬆散的模塊按照依賴和規則打包成符合生產環境部署的前端資源。還可以將按需載入的模塊進行代碼分隔,等到實際需要的時候再非同步載入。通過 loader 的轉換,任何形式的資源都可以視作模塊,比如 CommonJs 模塊、 AMD 模塊、 ES6 模塊、CSS、圖片、 JSON、Coffeescript、 LESS 等。
**當然個人還是喜歡webpack的模塊化優秀
廢話不多說現在開始gulp之旅
初始化項目(此處已經認為node環境已經安裝)
建立文件夾 名字自己隨便取 比如 gulpText,然後輸入以下命令
$ cd gulpText
$ mkdir images //建立存放圖片文件夾
$ mkdir src // 存放 js 以及css
$ mkdir index.html //主頁
$ mkdir gulpfile.js //編寫gulp 任務文件
$ mkdir mock //mock數據
然後輸入以下命令 然後一路點下去生成json文件
$npm init
打開json文件看到這樣的
1474889102536.png
全局安裝gulp以便我們運行gulp進行打包等操作
$npm install gulp -g
如果感覺npm安裝比較慢可以切換至cnpm下載,代碼如下
$npm install cnpm -g
安裝gulp包,方便我們引用gulp
$npm install gulp
成功截圖
1474889517162.png
編寫gulp任務
引入 gulp
//引入gulp
var gulp = require('gulp');
拷貝Index.html
//html
gulp.task('-index',function () {
gulp.src('./index.html')
.pipe(gulp.dest('./build'));
})
執行命令
$ gulp -index
1474890843877.png]( http://upload-images.jianshu.io/upload_images/2905209-c00d640651bde279.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 )
1474890828271.png
拷貝images
// images
gulp.task('-images',function () {
gulp.src('./images**/*')
.pipe(gulp.dest('./build/'));
})
執行命令
$ gulp -iamges
1474891076408.png
1474891039689.png
css預處理
現在我們在src目錄里創建文件styles放我們的scss代碼,需要把scss代碼編譯到/build/prd/styles/下
$ cd src
$ mkdir styles
$ cd styles
$ touch app.scss
$ touch common.scss
app.scss項目代碼
@charset "UTF-8";
@import "./common.scss";
body{
background-color: $base-color;
color: #000;
font-size: 20px;
font-weight: 800;
}
html{
width: 100%;
height: 100%;
}
html{
width: 100%;
height: 100%;
}
.lsds{
width: 100px;
height: 100px;
}
common.scss代碼
$base-color:yellow;
安裝css預編譯包
$ npm install gulp-sass //sass編輯包
$ npm install gulp-minify-css'); //css壓縮包
//引入css預處理模塊
var sass= require('gulp-sass');
//引入css壓縮模塊
var minifyCSS = require('gulp-minify-css');
//css預處理
var cssFiles=[
'./src/styles/app.scss'
];
gulp.task('scss',function () {
gulp.src(cssFiles)
.pipe(sass().on('error',sass.logError))
.pipe(minifyCSS())
.pipe(gulp.dest('./build/prd/styles/'))
})
編輯scss
$ gulp scss
開啟服務
安裝server包
$ npm install gulp-webserver
//引入gulp-webserver 模塊
var server = require('gulp-webserver');
gulp.task('server',function () {
gulp.src('./')
.pipe(server({
host:'127.0.0.1', //ip
port:80, //埠
directoryListing:{
enable:true,
path:'./'
},
livereload:true,
}));
})
J. webpack打包的CSS含有兩個相同的引入
1. 摘要
Webpack是一種前端資源構建工具,一個靜態模塊打包器。在Webpack看來,前端的所有資源文件(js/json/css/img/less/…)都會作為模塊處理,當Webpack處理應用程序時,它將根據模塊的依賴關系進行靜態分析,打包生成對應的靜態資源。Webpack打包流程圖如圖1-1所示。
想了解Webpack,看這篇就夠了
圖1-1 Webpack打包流程圖
2. Webpack五個核心概念
2.1 Entry
入口(Entry)指示Webpack以哪個文件作為入口起點分析構建內部依賴圖並進行打包。
2.2 Output
輸出(Output)指示Webpack打包後的資源bundles輸出到哪裡去,以及如何命名。
2.3 Loader
Loader讓Webpack能夠去處理那些非JavaScript語言的文件,Webpack本身只能理解JavaScript。
2.4 Plugins
插件(Plugins)可以用於執行范圍更廣的任務,插件的范圍包括從打包和壓縮,一直到重新定義環境中的變數等。
2.5 Mode
模式(Mode)指示Webpack使用相應模式的配置。分為development和proction兩種模式,下面分別進行簡述。
development: 開發模式,能讓代碼本地運行的環境,會將process.env.NODE_ENV的值設為development,同時啟用NamedChunksPlugin和NamedMolesPlugin插件;
proction: 生產模式,能讓代碼優化運行的環境,會將process.env.NODE_ENV的值設為proction,同時啟用FlagDependencyUsagePlugin、FlagIncludedChunksPlugin、MoleConcatenationPlugin、NoEmitreplaceStringsPlugin、OccurrenceOrderPlugin、SideEffectsFlagPlugin和UglifyJsPlugin插件。
3. Wbepack配置
3.1 webpack.config.js文件
webpack.config.js是webpack的配置文件,用來指示webpack工作,運行webpack指令時,會載入裡面的配置,所有構建工具都是基於nodejs平台運行的,默認採用commonjs模塊化。webpack.config.js基礎配置如圖3-1所示。
想了解Webpack,看這篇就夠了
圖3-1 webpack.config.js基礎配置
3.2 devServer配置
開發伺服器(devServer)用來實現自動化(自動編譯、自動打開瀏覽器、自動刷新瀏覽器),只會在內存中編譯打包,不會有任何文件輸出,本地安裝webpack-dev-server後,通過npx webpack-dev-server命令啟動devServer,核心代碼如圖3-2所示。
想了解Webpack,看這篇就夠了
圖3-2 devServer配置核心代碼
3.3 打包html/樣式/圖片/其它資源
打包不同的資源會使用不同的loader和插件,打包html/樣式/圖片/其它資源的流程如下所述。
3.3.1 打包html資源
1.下載html-webpack-plugin插件;
2.引入html-webpack-plugin插件;
3.使用html-webpack-plugin插件,並進行相應配置。
3.3.2 打包樣式資源
不同的樣式文件需要配置不同的loader
1.下載loader;
2.配置loader,css樣式文件使用css-loader和style-loader,less文件使用less-loader、css-loader和style-loader。其中css-loader的作用是將css文件變成commonjs模塊載入到js文件中,style-loader的作用是創建style標簽,將js中的樣式資源插入進去,添加到head中生效。
3.3.3 打包圖片資源
1.下載url-loader,file-loader
2.配置loader
3.3.4 打包其它資源
1.下載file-loader
2. 配置loader,配置該loader作用於不為html/css/less/js的其他文件
3.4 提取css成單獨文件/css兼容性處理/壓縮css
3.4.1 提取css成單獨文件
樣式文件打包後會默認和js文件一起輸出,可以通過插件將打包後的css文件單獨輸出,流程如下所述。
1.下載mini-css-extract-plugin插件
2.引用該插件
3.配置
3.4.2 css兼容性處理
1.下載postcss-loader和postcss-preset-env
2.在package.json中browsetslist屬性中分別對開發環境和生產環境進行兼容性配置,設置支持樣式的瀏覽器版本
3.通過postcss找到package.json中browserslist裡面的配置,通過配置載入指定的css兼容性樣式。
3.4.3 壓縮css
1.下載optimize-css-assets-webpack-plugin插件
2.引用該插件
3.使用該插件
3.5 js語法檢查eslint/js兼容性處理/js壓縮
3.5.1 js語法檢查eslint
1.下載eslint-loader和eslint
2.在package.json中的eslintConfig中進行配置
3.配置eslint-loader,其中只需檢測js文件並要排除第三方庫,只檢測自己寫的源代碼,同時可在options配置中設置fix:true,自動修復eslint的錯誤。
3.5.2 js兼容性處理
1.下載babel-loader、@babel/core、@babel/preset-env,通過@babel/preset-env做基本的js兼容性處理,然後通過corejs做前面無法實現的兼容性處理,並實現按需載入
2. 配置loader
js兼容性處理核心代碼如圖3-3所示
想了解Webpack,看這篇就夠了
圖3-3 js兼容性處理核心代碼
3.5.3 js壓縮
mode設置為proction生產環境時會自動壓縮js代碼。
4. webpack性能優化
可以從開發環境和生產環境分別對webpack進行性能優化。其中開發環境主要考慮從打包構建速度和代碼調試兩個方面進行優化,生產環境主要考慮從打包構建速度和代碼運行性能這兩個方面進行優化。下面簡單介紹下開發環境上通過HMR提升構建速度。
4.1 HMR
HMR(熱模塊替換),作用是一個模塊發生變化後,只會更新打包這一個模塊而不是所有模塊,通過在devServer中設置hot:true屬性啟動HMR功能。
其中對於樣式文件,可以使用HMR功能,因為style-loader內部實現了;
對於js文件,默認不能使用HMR功能,解決方法:修改入口文件js代碼,添加支持HMR功能的代碼,另外HMR只能處理非入口js文件的其他文件,對入口文件並不能生效,因為一旦入口文件更新,入口文件引入的其他文件一定會被重新載入;
對於html文件,默認不能使用HMR功能,同時會導致html文件不能熱更新,解決方法:修改entry入口文件,將html文件引入,只能解決html文件不能熱更新的問題。