亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

詳解webpack 入門與解析

2024-05-06 16:43:38
字體:
來源:轉載
供稿:網友

每次學新東西總感覺自己是不是變笨了,看了幾個博客,試著試著就跑不下去,無奈只有去看官方文檔。 webpack是基于node的。先安裝最新的node。

1.初始化

安裝node后,新建一個目錄,比如html5。cmd中切到當前文件夾。

npm init -y 

這個命令會創建一個默認的package.json。它包含了項目的一些配置參數,通過它可以進行初始安裝。詳細參數:https://docs.npmjs.com/files/package.json。

不要y參數的話,會在命令框中設置各項參數,但覺得沒啥必要。

2.安裝webpack

npm install webpack --save-dev

將webpack安裝到當前目錄。雖然npm install webpack -g 可以講webpack安裝到全局,但是容易出現一些模塊找不到的錯誤,所以最好還是安裝到當前目錄下。

3.目錄結構

webpack是一款模塊加載各種資源并打包的工具。所以先建一個如下的目錄結構:

webpack,入門與解析,入門

app包含的開發中的js文件,一個組件,一個入口。build中就是用來存放打包之后的文件的。webpack.config.js 顧名思義用來配置webpack的。package.json就不用說了。

component.js

export default function () { var element = document.createElement('h1'); element.innerHTML = 'Hello world'; return element;}

component.js 是輸出一個內容為h1元素。export default 是ES6語法,表示指定默認輸出。import的時候不用帶大括號。

index.js

import component from './component';document.body.appendChild(component());

index.js 的作用就是引用Component模塊,并在頁面上輸出一個h1元素。但完成這個還需要一個插件,因為目前我們還沒有index.html文件。

npm install html-webpack-plugin --save-dev

html-webpack-plugin的用來生成html,將其也安裝到開發目錄下面。

4.設置 webpack 配置文件

我們需要通過webpack.config.js文件告訴webpack如何開始。配置文件至少需要一個入口和一個輸出。多個頁面就需要多個入口。node的path模塊

const path = require('path');const HtmlWebpackPlugin = require('html-webpack-plugin');const PATHS = { app: path.join(__dirname, 'app'), build: path.join(__dirname, 'build'),};module.exports = { entry: { app: PATHS.app, }, output: { path: PATHS.build, filename: '[name].js', }, plugins: [ new HtmlWebpackPlugin({  title: 'Webpack demo', }), ],};

第一次看到這個配置文件是有點懵,主要是exports,分三個部分,一個入口,一個輸出,一個插件。入口指向了app文件夾。默認會把包含"index.js"的文件作為入口。輸出指定了build地址和一個文件名;[name]這兒表示占位符,可以看成webpack提供的一個變量。這個具體后面再看。而HtmlWebpackPlugin會生成一個默認的html文件。

5.打包

有了以上準備,直接輸入 webpack 就能運行了。

webpack,入門與解析,入門

這個輸出包含了Hash(每次打包值都不同),Version,Time(耗時)。以及輸出的文件信息。這時打開build文件夾,發現多了一個app.js和index.html文件,雙擊index.html:

webpack,入門與解析,入門

也可以修改下package.json

{ "name": "Html5", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "build": "webpack" }, "keywords": [], "author": "",  "license": "ISC", "devDependencies": { "html-webpack-plugin": "^2.28.0", "webpack": "^2.2.1" }}

指定build。在cmd中執行npm run build 得到同樣的結果

webpack,入門與解析,入門

出現helloword。再看下文件內容

index.html:

<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>Webpack demo</title> </head> <body> <script type="text/javascript" src="app.js"></script></body></html>

默認引用了app.js。

6、解析

app.js

/******/ (function(modules) { // webpackBootstrap/******/  // The module cache/******/  var installedModules = {};/******/  // The require function/******/  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)/******/   var module = installedModules[moduleId] = {/******/    i: moduleId,/******/    l: false,/******/    exports: {}/******/   };/******/   // Execute the module function/******/   modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);/******/   // Flag the module as loaded/******/   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;/******/  // identity function for calling harmony imports with the correct context/******/  __webpack_require__.i = function(value) { return value; };/******/  // define getter function for harmony exports/******/  __webpack_require__.d = function(exports, name, getter) {/******/   if(!__webpack_require__.o(exports, name)) {/******/    Object.defineProperty(exports, name, {/******/     configurable: false,/******/     enumerable: true,/******/     get: getter/******/    });/******/   }/******/  };/******/  // getDefaultExport function for compatibility with non-harmony modules/******/  __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;/******/  };/******/  // Object.prototype.hasOwnProperty.call/******/  __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };/******/  // __webpack_public_path__/******/  __webpack_require__.p = "";/******/  // Load entry module and return exports/******/  return __webpack_require__(__webpack_require__.s = 1);/******/ })/************************************************************************//******/ ([/* 0 *//***/ (function(module, __webpack_exports__, __webpack_require__) {"use strict";/* harmony default export */ __webpack_exports__["a"] = function () { var element = document.createElement('h1'); element.innerHTML = 'Hello world'; return element;};/***/ }),/* 1 *//***/ (function(module, __webpack_exports__, __webpack_require__) {"use strict";Object.defineProperty(__webpack_exports__, "__esModule", { value: true });/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__component__ = __webpack_require__(0);document.body.appendChild(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__component__["a" /* default */])());/***/ })/******/ ]);

而app.js內容比較多了。整體是一個匿名函數。

(function(module) {})([(function (){}), function() {}])

app文件夾中的兩個js文件成了這兒的兩個模塊。函數最開始是從__webpack_require__開始

return __webpack_require__(__webpack_require__.s = 1);

這里指定從模塊1執行(賦值語句的返回值為其值)。而模塊1的調用是通過__webpack_require__的這句執行的。

 

復制代碼 代碼如下:
modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);

 

通過call調用模塊的主要作用是為了把參數傳過去。

(function(module, __webpack_exports__, __webpack_require__) {"use strict";Object.defineProperty(__webpack_exports__, "__esModule", { value: true });/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__component__ = __webpack_require__(0);document.body.appendChild(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__component__["a" /* default */])());/***/ })

__webpack_require__ 每加載一個模塊都會先去模塊緩存中找,沒有就新建一個module對象:

var module = installedModules[moduleId] = {   i: moduleId,   l: false,   exports: {}  };

模塊1中加載了模塊0,

var __WEBPACK_IMPORTED_MODULE_0__component__ = __webpack_require__(0);

__WEBPACK_IMPORTED_MODULE_0__component__ 返回的是這個模塊0的exports部分。而之前Component.js的默認方法定義成了

__webpack_exports__["a"] = function () {var element = document.createElement('h1');element.innerHTML = 'Hello world';return element;}

所以再模塊1的定義通過"a“來獲取這個方法:

 

復制代碼 代碼如下:
document.body.appendChild(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__component__["a" /* default */])());

 

這樣就完整了,但這里使用了__webpack_require__.i 將原值返回。

/******/  // identity function for calling harmony imports with the correct context/******/  __webpack_require__.i = function(value) { return value; };

不太明白這個i函數有什么作用。這個注釋也不太明白,路過的大神希望可以指點下。

小結:

webpack通過一個立即執行的匿名函數將各個開發模塊作為參數初始化,每個js文件(module)對應一個編號,每個js中export的方法或者對象有各自指定的關鍵字。通過這種方式將所有的模塊和接口方法管理起來。然后先加載最后的一個模塊(應該是引用別的模塊的模塊),這樣進而去觸發別的模塊的加載,使整個js運行起來。到這基本了解了webpack的功能和部分原理,但略顯復雜,且沒有感受到有多大的好處。繼續探索。

demo:webpack.rar建議用最新的node安裝,不然build后的結果可能出錯。

參考:

https://survivejs.com/webpack/developing/getting-started/

https://webpack.js.org/

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久91精品国产91久久跳| 色偷偷偷综合中文字幕;dd| 国产精品美女主播| 免费91在线视频| 青青a在线精品免费观看| 欧美日韩不卡合集视频| 精品小视频在线| 国外成人免费在线播放| 久久久电影免费观看完整版| 热99精品里视频精品| 国产91在线播放九色快色| 97国产精品视频人人做人人爱| 亚洲国产精品美女| 91免费看国产| 精品日韩中文字幕| 日韩欧美主播在线| 97国产真实伦对白精彩视频8| 91香蕉电影院| 午夜欧美大片免费观看| 日韩av影视在线| 亚洲iv一区二区三区| 亚洲色图13p| 欧美精品亚州精品| 亚洲网站在线看| 在线精品国产欧美| 欧美日韩国产成人| 欧美激情亚洲精品| 国语自产精品视频在线看| 日韩有码在线观看| 国产精品精品视频一区二区三区| 国产精品美女久久久久av超清| 69av在线播放| 亚洲一区制服诱惑| 日韩激情在线视频| 欧美黑人性视频| xxx一区二区| 亚洲欧美制服综合另类| 日韩有码在线观看| 最好看的2019的中文字幕视频| 91精品视频大全| 亚洲精品久久久久久久久久久| 国产亚洲精品美女久久久| 77777亚洲午夜久久多人| 久久精品成人一区二区三区| 欧美午夜视频在线观看| 亚洲人成在线播放| 亚洲成人av在线| 欧美高清电影在线看| 亚洲大胆人体在线| 成人乱人伦精品视频在线观看| 国产精品吴梦梦| 亚洲91精品在线观看| 精品久久久久久国产| 日日摸夜夜添一区| 欧美在线日韩在线| 日韩欧美在线看| 97视频在线观看免费| 久久中文字幕国产| 国产成人啪精品视频免费网| 亚洲va久久久噜噜噜久久天堂| 国产成人aa精品一区在线播放| 在线一区二区日韩| 一区二区欧美亚洲| 欧美日韩在线观看视频| 亚洲男人7777| 欧美肥老太性生活视频| 日韩国产激情在线| 久久久av亚洲男天堂| 欧美国产日韩中文字幕在线| 欧美性色xo影院| 色yeye香蕉凹凸一区二区av| 91亚洲人电影| 日韩欧美在线免费| 91av在线不卡| 91精品国产乱码久久久久久蜜臀| 亚洲欧美另类自拍| 亚洲成人在线网| 亚洲新声在线观看| 日韩av在线不卡| 欧美色视频日本版| 91九色精品视频| 久久精品99久久久久久久久| 日韩电影中文 亚洲精品乱码| 成人久久18免费网站图片| 色噜噜狠狠狠综合曰曰曰| 成人高h视频在线| 久久久中文字幕| 亚洲欧美国产一本综合首页| 亚洲色图美腿丝袜| 91成人性视频| 国产色视频一区| 欧美性色19p| 欧美日韩国产中文字幕| 欧美成年人视频网站欧美| 欧美精品在线免费| 久久久久久久一区二区| 日韩视频精品在线| 日韩精品在线视频美女| 欧美午夜激情在线| 久久精品一区中文字幕| 欧美日韩日本国产| 奇米一区二区三区四区久久| 中文在线资源观看视频网站免费不卡| 国内精品国产三级国产在线专| 6080yy精品一区二区三区| 亚洲女人被黑人巨大进入| 国产亚洲免费的视频看| 国产成人精品电影久久久| 中文字幕亚洲一区二区三区| 欧美高清视频在线播放| 日本不卡高字幕在线2019| 日韩不卡在线观看| 亚洲成人激情在线| 久久久久国产精品一区| 在线电影av不卡网址| 国产日韩欧美日韩| 欧美另类极品videosbest最新版本| 国产欧美在线看| 国产免费久久av| 亚洲福利影片在线| 精品香蕉一区二区三区| 久久久久久久成人| 色婷婷av一区二区三区久久| 草民午夜欧美限制a级福利片| 美日韩精品免费视频| 日韩av在线资源| 97超级碰碰碰| 成人黄色av免费在线观看| 国模精品一区二区三区色天香| 成人av资源在线播放| 26uuu久久噜噜噜噜| 国产精品女人网站| 精品香蕉在线观看视频一| 久久久久久久国产精品| 91国产精品91| 欧美性xxxxx极品娇小| 亚洲欧美国产精品va在线观看| 欧美日韩精品在线观看| 奇门遁甲1982国语版免费观看高清| 性欧美长视频免费观看不卡| 国产精品444| 国产精品pans私拍| 亚洲视频视频在线| 国产69久久精品成人| 欧美在线影院在线视频| 日本精品一区二区三区在线| 久久亚洲私人国产精品va| 在线观看91久久久久久| 欧日韩不卡在线视频| 国产精品成人国产乱一区| 欧美电影免费观看大全| 97久久伊人激情网| 欧美性极品少妇精品网站| 国产精品扒开腿做爽爽爽的视频| 国内精品久久久久久影视8| 国产精品久久一区| 欧美激情国内偷拍| 日韩精品免费在线视频观看| 国产精品自在线| 欧美日韩国产丝袜另类| 欧美激情综合亚洲一二区| 国产精品久久二区| 国产精品一区二区久久国产| 亚洲在线视频福利|