摘要:主題本文為的基礎(chǔ)部分,旨在如何從搭建一個(gè)工程環(huán)境,并簡單介紹打包之后生成什么代碼,并且介紹的常用的各種,的配置跟解決了什么問題本篇為第一篇項(xiàng)目初始化安裝個(gè)人比較喜歡用初始化項(xiàng)目完成后再在目錄里新建一個(gè)文件用于放我們的源代碼,創(chuàng)建一個(gè)作
主題
本文為webpack的基礎(chǔ)部分, 旨在如何從0搭建一個(gè)工程環(huán)境,并簡單介紹打包之后生成什么代碼, 并且介紹webpack的常用的各種loader,plugin的配置 跟解決了什么問題 本篇為第一篇
項(xiàng)目初始化 安裝webpackyarn init -y
個(gè)人比較喜歡用yarn初始化項(xiàng)目 完成后
yarn add webpack webpack-cli -D
再在目錄里新建一個(gè)src 文件用于放我們的源代碼,src創(chuàng)建一個(gè)index.js作為本次的入口文件 index.js 隨便輸入點(diǎn)什么
在當(dāng)前目錄下直接運(yùn)行
npx webpack
警告我們需要配置一個(gè)mode指明是生產(chǎn)環(huán)境還是開發(fā)環(huán)境
打包成功 并且在目錄下生成一個(gè)dist文件
npx 會(huì)去找node_modules/.bin/webpack.cmd 文件
這個(gè)文件就做了一個(gè)判斷 判斷當(dāng)前目錄下有沒有node.exe 有就執(zhí)行當(dāng)前目錄下的webpack.js 沒有用node執(zhí)行上一級的webpack.js
webpack.js 會(huì)去找webpack-cli.js
在webpack-cli的文件目錄下可以找到config-yargs.js 配置文件 其中一段代碼寫明了要求什么配置文件
.options({ config: { type: "string", describe: "Path to the config file", group: CONFIG_GROUP, defaultDescription: "webpack.config.js or webpackfile.js", requiresArg: true },
這里講明webpack默認(rèn)配置文件需取名webpack.config.js 或者webpackfile.js ,
所以說,我們?nèi)绻枰米远x的名字去配置, 需要在命令行里自行添加config 指定webpack用哪個(gè)配置去打包
如:
npx webpack --config [webpack-config的path]打包之后的文件
在項(xiàng)目根目錄下新建文件webpack.config.js 并且導(dǎo)出去
const path = require("path") module.exports = { mode:"development", // 指定生產(chǎn)還是開發(fā) entry:"./src/index.js", // 入口文件 output:{ filename:"bundle.js", // 打包后的文件名 path:path.resolve(__dirname,"./dist") // 這里需指定一個(gè)絕對路徑 我們需要node的path模塊去解析路徑 } }
再執(zhí)行npx webpack
看看這個(gè)bundle.js 長什么樣子
暫時(shí)不管__webpack_require__上的屬性 簡寫下就是
一個(gè)自執(zhí)行函數(shù)傳入一個(gè)obj 并且在里面自己定義了一個(gè)require方法 返回require的執(zhí)行結(jié)果
obj的key是打包文件的path路徑, value是一個(gè)函數(shù) , 方法體是用eval執(zhí)行index.js內(nèi)部的代碼。
重點(diǎn)就是require做了什么
moduleId 就是__webpack_require__.s = "./src/index.js"
定義了一個(gè)緩存 {"./src/index.js":...} 如果存在,也就是打包過了, 則直接返回,如果沒有則創(chuàng)建一個(gè)對象
{ i:moduleId, // 模塊的標(biāo)識 l:false, // 表示是否打包過 exports:{} }
并且引用給module,
然后用modules[moduleId].call 執(zhí)行 modules 就是最外部傳入的那個(gè)自執(zhí)行函數(shù)的參數(shù)obj{"path":代碼塊}
這段代碼就是說 執(zhí)行這個(gè)obj的代碼塊,上下文指向module.exports, 傳入module,module.exports,跟require函數(shù)做參數(shù)
(function(module, exports) { // module對應(yīng)傳入的module(installedModules[moduleId]) ,exports對應(yīng)module.exports eval("console.log("webpack") //# sourceURL=webpack:///./src/index.js?"); })
這段代碼執(zhí)行了就是輸出了"webpack"
modules[moduleId].call做的事就是執(zhí)行傳入模塊moduleId對應(yīng)的代碼而已
注: 如果此時(shí)index.js 內(nèi)部有import 之類導(dǎo)入其他的模塊 其他的模塊也會(huì)解析成obj的key跟value格式 他會(huì)遞歸去用require解析
比如在index.js 里 import a from "./a.js" 他的value是這樣的:
function(module, exports, require) { "use strict"; eval("require.r(exports); var a = require("./src/a.js"); // a是require執(zhí)行后返回的module.exports var a_default = require.n(a); // 返回的是獲取模塊的函數(shù) console.log("webpack")"); }
require.r 就是在exports上定義了個(gè)屬性作為標(biāo)識
require.n就是執(zhí)行了require.d 并且返回了一個(gè)獲取模塊的方法,
require.d 就是在此函數(shù)上添加了 "a", 當(dāng)訪問getter.a 的時(shí)候執(zhí)行g(shù)etter
最后:
這樣層層遞歸 一層層打包 最終生成module.exports 返回
module.l 改變true 表示當(dāng)前這個(gè)module已經(jīng)打包完成 最后返回module.exports
下一節(jié)預(yù)告:webpack.config.js的配置
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/102034.html
摘要:多頁面配置進(jìn)擊基礎(chǔ)篇一進(jìn)擊基礎(chǔ)篇二配置多頁面配置多頁面配置即是多入口需要寫成對象形式,注意數(shù)組形式會(huì)變成多入口單頁面,因?yàn)榇虬蟮臅?huì)合并成一個(gè)入口文件出口不能寫同一個(gè)文件用代替以上配置并不能多頁面,還需要個(gè)模板,并且指明各自的代碼塊去生成 多頁面配置 進(jìn)擊webpack 4 (基礎(chǔ)篇一) 進(jìn)擊webpack4 (基礎(chǔ)篇二:配置) ## 多頁面配置 ## 多頁面配置即是多入口 entr...
摘要:進(jìn)擊基礎(chǔ)篇一進(jìn)擊基礎(chǔ)篇二配置一進(jìn)擊基礎(chǔ)篇三配置二不解析不依賴第三方模塊的模塊有一些第三方模塊,它本身不依賴于其他模塊,比如,,不去編譯這些庫,會(huì)使得打包更加快速是個(gè)正則或者包含正則的數(shù)組不去解析忽略 進(jìn)擊webpack 4 (基礎(chǔ)篇一)進(jìn)擊webpack4 (基礎(chǔ)篇二:配置 一)進(jìn)擊webpack4 (基礎(chǔ)篇三:配置 二) 不解析不依賴第三方模塊的模塊 noParse 有一些第三方模塊...
摘要:進(jìn)入入口起點(diǎn)后,會(huì)找出有哪些模塊和庫是入口起點(diǎn)直接和間接依賴的。用于對模塊的源代碼進(jìn)行轉(zhuǎn)換。指定生產(chǎn)還是開發(fā)入口文件打包后的文件名這里需指定一個(gè)絕對路徑我們需要的模塊去解析路徑包含一系列的規(guī)則是一個(gè)具有屬性的對象。 前文:進(jìn)擊webpack 4 (基礎(chǔ)篇 一) webpack.config.js基礎(chǔ)配置 webpack 有4大概念 入口(entry) 輸出(output) load...
摘要:中有三種數(shù)據(jù)結(jié)構(gòu)棧堆隊(duì)列。前端進(jìn)擊的巨人一執(zhí)行上下文與執(zhí)行棧,變量對象中解釋執(zhí)行棧時(shí),舉了一個(gè)乒乓球盒子的例子,來演示棧的存取方式,這里再舉個(gè)栗子搭積木。對于基本類型,棧中存儲的就是它自身的值,所以新內(nèi)存空間存儲的也是一個(gè)值。 面試經(jīng)常遇到的深淺拷貝,事件輪詢,函數(shù)調(diào)用棧,閉包等容易出錯(cuò)的題目,究其原因,都是跟JavaScript基礎(chǔ)知識不牢固有關(guān),下層地基沒打好,上層就是豆腐渣工程,...
摘要:希望幫助更多的前端愛好者學(xué)習(xí)。前端開發(fā)者指南作者科迪林黎,由前端大師傾情贊助。翻譯最佳實(shí)踐譯者張捷滬江前端開發(fā)工程師當(dāng)你問起有關(guān)與時(shí),老司機(jī)們首先就會(huì)告訴你其實(shí)是個(gè)沒有網(wǎng)絡(luò)請求功能的庫。 前端基礎(chǔ)面試題(JS部分) 前端基礎(chǔ)面試題(JS部分) 學(xué)習(xí) React.js 比你想象的要簡單 原文地址:Learning React.js is easier than you think 原文作...
閱讀 3119·2021-11-19 09:40
閱讀 1577·2021-11-15 11:39
閱讀 691·2021-10-08 10:05
閱讀 2289·2021-09-03 10:29
閱讀 3420·2021-08-12 13:22
閱讀 2191·2019-08-30 15:54
閱讀 3725·2019-08-30 14:03
閱讀 2664·2019-08-30 13:45