webpack-cli在webpack打包中的作用小結(jié)
webpack & webpack-cli
webpack Introduction
webpack 是一個靜態(tài)的模塊化打包工具,為現(xiàn)代的JavaScript應(yīng)用程序服務(wù)
打包 bundler:webpack可以幫助我們進行打包,所以它是一個打包工具
靜態(tài)的static:將代碼打包成最終的靜態(tài)資源(部署到靜態(tài)服務(wù)器)
模塊化module:webpack默認支持各種模塊化開發(fā),ES Module、CommonJS、AMD等
現(xiàn)代modern:前端開發(fā)的各種問題,催生了webpack的出現(xiàn)
webpack 安裝
npm install webapck webpack-cli --save-dev
webpack 從 4.0 版本開始,在安裝時,就必須要安裝這兩個東西。
webpack 是打包代碼時依賴的核心內(nèi)容,而 webpack-cli 是一個用來在命令行中運行 webpack 的工具。
但,webpack-cli對于打包文件不是必要的,這是為什么呢?
webpack-cli 詳解
以 npm run build
命令來解析 webpack-cli 在代碼打包中的作用,wk.config.js 為自定義webpack 配置文件
"scripts": { "build": "webpack --config wk.config.js" }
當(dāng)在命令行中執(zhí)行 npm run build 時,會執(zhí)行node_modules/.bin下的webpack可執(zhí)行文件
這里有三個可執(zhí)行文件,分別對應(yīng)不同的平臺
# unix 系統(tǒng)默認可執(zhí)行文件,必須輸入完整文件名 webpack ? # windows cmd 中默認的可執(zhí)行文件 webpack.cmd ? # windows PowerShell 中可執(zhí)行文件,可以跨平臺 webpack.ps1
以webpack可執(zhí)行文件內(nèi)容為例:
#!/bin/sh basedir=$(dirname "$(echo "$0" | sed -e 's,\,/,g')") ? case `uname` in *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; esac ? if [ -x "$basedir/node" ]; then "$basedir/node" "$basedir/../webpack/bin/webpack.js" "$@" ret=$? else node "$basedir/../webpack/bin/webpack.js" "$@" ret=$? fi exit $ret
從代碼中可以看到,會執(zhí)行node_modules/webpack/bin/ 目錄下的webpack.js,該文件主要代碼如下:
// 該函數(shù)用于執(zhí)行命令,例如用于下載需要的包 const runCommand = (command ,args) => {} ? // 判斷該包是否安裝 const isInstalled = packageName => {} ? // 該函數(shù)用于執(zhí)行webpack-cli包中bin目錄下的cli.js文件 const runCli = cli => { const path = require("path"); const pkgPath = require.resolve(`${cli.package}/package.json`); // pkgPath: D:\webpack\node_modules\webpack-cli\package.json const pkg = require(pkgPath); // pkg: webpack-cli的package.json 中的配置 // path.resolve(path.dirname(pkgPath), pkg.bin[cli.binName]): D:\webpack\node_modules\webpack-cli\bin\cli.js require(path.resolve(path.dirname(pkgPath), pkg.bin[cli.binName])); } ? if (!cli.installed) { // 判斷 webpack-cli 是否安裝 // 如果沒有安裝,詢問用于是否安裝 webpack-cli ... ... } else { runCli(cli); }
該文件最重要的函數(shù)就是 runCli
,該函數(shù)可以執(zhí)行 webpack-cli 包中bin目錄下的cli.js 文件,也就是說在此之前的步驟只是為了找到cli.js文件,在此之后,webpack-cli 才發(fā)揮作用。
同時,webpack.js 文件也做了一些輔助判斷,首先查看你是否安裝了webpack-cli,如果沒有安裝,就會詢問你是否安裝(或手動安裝)該包,如果選擇不安裝,那么程序運行到這就停止了。
接著打開webpack-cli/bin/cli.js
#!/usr/bin/env node ? "use strict"; ? const importLocal = require("import-local"); const runCLI = require("../lib/bootstrap"); ? if (!process.env.WEBPACK_CLI_SKIP_IMPORT_LOCAL) { // Prefer the local installation of `webpack-cli` if (importLocal(__filename)) { return; } } ? process.title = "webpack"; ? runCLI(process.argv);
該文件的主要函數(shù)為 runCLI
,而 runCLI
又來自 bootstrap.js 文件,打開 bootstrap.js 文件
const WebpackCLI = require("./webpack-cli"); ? const runCLI = async (args) => { // Create a new instance of the CLI object const cli = new WebpackCLI(); ? try { await cli.run(args); } catch (error) { cli.logger.error(error); process.exit(2); } }; ? module.exports = runCLI;
注意,到了這里才真正用到了 webpack-cli 暴露出的接口,cli.run(args) 用來處理命令行參數(shù),此時args參數(shù)為:
[ 'E:\nodejs\node.exe', 'D:\webpack\node_modules\webpack\bin\webpack.js', '--config', 'wk.config.js' ]
最終,從以上整個過程,我們可以知道 webpack-cli 是用來處理命令行參數(shù),并通過參數(shù)構(gòu)建 compiler 對象,然后才是對代碼進行打包的過程。
這同時也解決了前文提出的問題,為什么webpack-cli對于文件打包不是必需的。 既然 webpack-cli
只是為了處理命令行參數(shù),那我們同樣可以構(gòu)建自己的cli來處理參數(shù),比如 lyx-cli。在第三方框架中,React 和 Vue(未使用Vite的版本)也沒有使用 webpack-cli.
Reference
到此這篇關(guān)于webpack-cli在webpack打包中的作用小結(jié)的文章就介紹到這了,更多相關(guān)webpack webpack-cli作用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS中IP地址與整數(shù)相互轉(zhuǎn)換的實現(xiàn)代碼
這篇文章主要介紹了JS中IP地址與整數(shù)相互轉(zhuǎn)換的實現(xiàn)代碼,需要的朋友可以參考下2017-04-04js調(diào)試系列 斷點與動態(tài)調(diào)試[基礎(chǔ)篇]
上幾篇文章已經(jīng)為大家介紹了js調(diào)試系列的一些基礎(chǔ)知識,支持亂碼兄弟為大家?guī)砹薺s斷點與動態(tài)調(diào)試方法,需要的朋友可以參考下2014-06-06JavaScript+Canvas實現(xiàn)彩色圖片轉(zhuǎn)換成黑白圖片的方法分析
這篇文章主要介紹了JavaScript+Canvas實現(xiàn)彩色圖片轉(zhuǎn)換成黑白圖片的方法,結(jié)合實例形式分析了javascript結(jié)合HTML5相關(guān)函數(shù)修改頁面圖片元素顯示效果相關(guān)操作技巧,需要的朋友可以參考下2018-07-07JavaScript如何實現(xiàn)組合列表框中元素移動效果
在頁面中有兩個列表框,需要把其中一個列表框的元素移動到另一個列表框,怎么實現(xiàn)此功能呢,下面通過本文給大家介紹JavaScript如何實現(xiàn)組合列表框中元素移動效果,感興趣的朋友一起學(xué)習(xí)吧2016-03-03javascript實現(xiàn)簡單的頁面右下角提示信息框
本文給大家分享的是使用javascript實現(xiàn)簡單的頁面右下角提示信息框的方法和示例代碼,有需要的小伙伴可以參考下。2015-07-07