摘要:原文鏈接現(xiàn)在的不再是入門噩夢過去最讓人心塞的莫過于配置文件,而誕生隨之而來的是無配置。所以大家完全可以自己打一個最簡單的包,還能修改插件對比前后的區(qū)別。然后運(yùn)行即可在看到打包后的文件。
原文鏈接:https://ssshooter.com/2019-02...
現(xiàn)在的 webpack 不再是入門噩夢,過去 webpack 最讓人心塞的莫過于配置文件,而 webpack4 誕生隨之而來的是無配置 webpack。
使用 webpack4,至少只需要安裝 webpack 和 webpack cli。所以大家完全可以自己打一個最簡單的包,還能修改插件對比前后的區(qū)別。
npm i webpack webpack-cli -D 安裝后,因為 webpack4 會默認(rèn) src 為入口目錄,所以先新建 src/index.js。
// src/index.js import { sth } from "./shouldImport" import other from "./shouldImport" let test = "this is a variable" export default { a: test + "," + sth, other, }
為了更了解 webpack? 導(dǎo)入機(jī)制所以再新建 src/shouldImport.js。
// src/shouldImport.js export let sth = "something you need" export default { others: "", }
然后運(yùn)行 node_modules/.bin/webpack --mode development 即可在 dist/main.js 看到打包后的文件。
但是默認(rèn)設(shè)置中模塊文件會被 eval 包裹導(dǎo)致不便查看,所以需要再在設(shè)置做一點修改,把 devtool 屬性改為 "source-map":
// 在根目錄新建 webpack.config.js 文件 module.exports = mode => { if (mode === "production") { return {} } return { devtool: "source-map", } }
然后再打包應(yīng)該就能看到類似一下的文件結(jié)構(gòu),開發(fā)環(huán)境下打包得到的文件自帶注釋,理解起來不難:
;(function(modules) { // webpackBootstrap // The module cache 模塊緩存 var installedModules = {} // The require function 請求函數(shù) function __webpack_require__(moduleId) { // Check if module is in cache // 檢查模塊是否在緩存 if (installedModules[moduleId]) { return installedModules[moduleId].exports } // Create a new module (and put it into the cache) // 創(chuàng)建新模塊并放進(jìn)緩存 var module = (installedModules[moduleId] = { i: moduleId, l: false, exports: {}, }) // Execute the module function // 執(zhí)行模塊函數(shù)(有點不懂為什么 this 要傳入 module.exports) modules[moduleId].call( module.exports, // this module, // 模塊對象本身 module.exports, // 模塊對象的 exports 屬性 __webpack_require__ // 請求函數(shù)最終返回模塊輸出,傳入用于請求其他模塊 ) // Flag the module as loaded // 加載完成標(biāo)志 module.l = true // Return the exports of the module // 返回模塊的輸出 return module.exports } // expose the modules object (__webpack_modules__) // 暴露所有模塊對象 __webpack_require__.m = modules // expose the module cache // 暴露模塊緩存 __webpack_require__.c = installedModules // Object.prototype.hasOwnProperty.call __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property) } // define getter function for harmony exports // 為 ES6 export 定義 getter 函數(shù) __webpack_require__.d = function(exports, name, getter) { if (!__webpack_require__.o(exports, name)) { // 檢查屬性是否存在 Object.defineProperty(exports, name, { enumerable: true, get: getter }) } } // define __esModule on exports // 于 export 定義 __esModule __webpack_require__.r = function(exports) { if (typeof Symbol !== "undefined" && Symbol.toStringTag) { Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }) } Object.defineProperty(exports, "__esModule", { value: true }) } // create a fake namespace object // 創(chuàng)建代用命名空間對象 // mode & 1: value is a module id, require it // value 是模塊 id,必要 // mode & 2: merge all properties of value into the ns // 合并 value 所有屬性到 ns // mode & 4: return value when already ns object // ns 已經(jīng)是對象時返回 value // mode & 8|1: behave like require // 表現(xiàn)如 require __webpack_require__.t = function(value, mode) { if (mode & 1) value = __webpack_require__(value) if (mode & 8) return value if (mode & 4 && typeof value === "object" && value && value.__esModule) return value var ns = Object.create(null) __webpack_require__.r(ns) Object.defineProperty(ns, "default", { enumerable: true, value: value }) if (mode & 2 && typeof value != "string") for (var key in value) __webpack_require__.d( ns, key, function(key) { return value[key] }.bind(null, key) ) return ns } // getDefaultExport function for compatibility with non-harmony modules // 用于兼容非 ES6 模塊的 getDefaultExport 函數(shù) __webpack_require__.n = function(module) { var getter = module && module.__esModule ? function getDefault() { return module["default"] } : function getModuleExports() { return module } __webpack_require__.d(getter, "a", getter) return getter } // __webpack_public_path__ __webpack_require__.p = "" // Load entry module and return exports // 加載入口模塊并返回 export return __webpack_require__((__webpack_require__.s = "./src/index.js")) })({ "./src/index.js": /*! exports provided: default */ function(module, __webpack_exports__, __webpack_require__) { "use strict" __webpack_require__.r(__webpack_exports__) // 于 export 定義 __esModule /* harmony import */ var _shouldImport__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__( "./src/shouldImport.js" ) let test = "this is a variable" /* harmony default export */ __webpack_exports__["default"] = { a: test + "," + _shouldImport__WEBPACK_IMPORTED_MODULE_0__["sth"], other: _shouldImport__WEBPACK_IMPORTED_MODULE_0__["default"], } }, "./src/shouldImport.js": /*! exports provided: sth, default */ function(module, __webpack_exports__, __webpack_require__) { "use strict" __webpack_require__.r(__webpack_exports__) /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sth", function() { return sth }) let sth = "something you need" __webpack_exports__["default"] = { others: "", } }, })
源文件中的所有 import 和 export 都會轉(zhuǎn)換為對應(yīng)的輔助函數(shù)。
import 對應(yīng) __webpack_require__
export 對應(yīng) __webpack_exports__["default"] 直接賦值和 __webpack_require__.d。
整理一下整個流程:
定義 __webpack_require__ 及其輔助函數(shù)
使用 __webpack_require__ 引入入口模塊
__webpack_require__ 函數(shù)載入模塊,將模塊放到模塊緩存
調(diào)用模塊
同樣使用 __webpack_require__ 讀取依賴(回到第 3 步)
運(yùn)行模塊內(nèi)部功能
使用 __webpack_exports__["default"] 直接賦值和 __webpack_require__.d 輸出
運(yùn)行結(jié)束
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/101864.html
摘要:支持轉(zhuǎn)義轉(zhuǎn)義需要的依賴,支持裝飾器。在中增加的配置數(shù)組中。壓縮文件安裝依賴在中的中增加配置打包前先清空輸出目錄在中增加的配置至此,配置已經(jīng)基本能滿足需求。 webpack 核心概念: Entry: 入口 Module:模塊,webpack中一切皆是模塊 Chunk:代碼庫,一個chunk由十多個模塊組合而成,用于代碼合并與分割 Loader:模塊轉(zhuǎn)換器,用于把模塊原內(nèi)容按照需求轉(zhuǎn)換成...
摘要:由于項目的不斷擴(kuò)大,只會影響我們定位功能和問題的速度,因此對冗余文件進(jìn)行清理,是很重要的。我們在項目中使用的,自動將各個圖標(biāo)進(jìn)行。 進(jìn)入公司之后,接手的便是前人留下來的一個大項目。慶幸的是整個項目擁有完善的產(chǎn)品功能文檔,但是由于項目過于龐大,老舊。包含了打包過慢,冗余文件過多等諸多問題。想要快速的解決這些問題,想要完全把功能重構(gòu)一遍的話,成本太高了。一個一個文件來過,時間成本也比較大。...
摘要:開發(fā)一個自己的腳手架了解了一些腳手架的工作方式與的基本概念,咱們就可以來創(chuàng)建一個屬于自己的腳手架。引言 下面是一個使用腳手架來初始化項目的典型例子。 ? showImg(https://user-gold-cdn.xitu.io/2019/5/16/16ac081750971790); ? ? 隨著前端工程化的理念不斷深入,越來越多的人選擇使用腳手架來從零到一...
摘要:繼個實例入門并掌握二后續(xù)配置配置配置使用加快打包速度多頁面打包配置編寫編寫編寫十七配置源碼地址本節(jié)使用的代碼為基礎(chǔ)我們來模擬平時開發(fā)中,將打包完的代碼防止到服務(wù)器上的操作,首先打包代碼然后安裝一個插件在中配置一個命令運(yùn) 繼 24 個實例入門并掌握「Webpack4」(二) 后續(xù): PWA 配置 TypeScript 配置 Eslint 配置 使用 DLLPlugin 加快打包速度 多...
閱讀 1239·2021-11-11 16:55
閱讀 1537·2021-10-08 10:16
閱讀 1188·2021-09-26 10:20
閱讀 3569·2021-09-01 10:47
閱讀 2451·2019-08-30 15:52
閱讀 2682·2019-08-30 13:18
閱讀 3194·2019-08-30 13:15
閱讀 1115·2019-08-30 10:55