JavaScript中使用import 和require打包后實(shí)現(xiàn)原理分析
前言:
之前使用ES6寫代碼,webpack打包后上線,一點(diǎn)問題沒有,也看過打包后的代碼,長的很亂,也沒敢看看咋回事,加載后就是能運(yùn)行!
今天通過個(gè)例子理解一下打包前,和打包后的代碼!
1.創(chuàng)建文件夾,并在里面創(chuàng)建兩個(gè)文件夾,app文件夾和public文件夾,app文件夾用來存放原始數(shù)據(jù)和我們將寫的JavaScript模塊,public文件夾用來存放之后供瀏覽器讀取的文件(包括使用webpack打包生成的js文件以及一個(gè) index.html 文件)。接下來我們再創(chuàng)建三個(gè)文件:
- index.html --放在public文件夾中;
- Greeter.js -- 放在app文件夾中;
- main.js -- 放在app文件夾中;
此時(shí)項(xiàng)目結(jié)構(gòu)如下圖所示
項(xiàng)目結(jié)構(gòu)
我們在 index.html 文件中寫入最基礎(chǔ)的html代碼,它在這里目的在于引入打包后的js文件(這里我們先把之后打包后的js文件命名為 bundle.js ,之后我們還會(huì)詳細(xì)講述)。
<!-- index.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>sample Project</title> </head> <body> <div id='root'> </div> <script src="bundle.js"></script> </body> </html>
我們在 Greeter.js 中定義一個(gè)返回包含問候信息的 html 元素的函數(shù),并依據(jù)CommonJS規(guī)范導(dǎo)出這個(gè)函數(shù)為一個(gè)模塊:
// Greeter.js exports.greet= function() { var greet = document.createElement('div'); greet.textContent = "Hi there and greetings!"; return greet; }; exports.USER_INFO = "userInfo";
main.js 文件中我們寫入下述代碼,用以把 Greeter模塊 返回的節(jié)點(diǎn)插入頁面。
//main.js let {greeter,USER_INFO} =require('./Greeter.js'); console.log(USER_INFO); document.querySelector("#root").appendChild(greeter());
使用webpack打包后:
(function(modules){ var installedModules = {}; function __webpack_require__(moduleId) { if (installedModules[moduleId]) { return installedModules[moduleId].exports; } var module = installedModules[moduleId] = { i: moduleId, l: false, exports: {} }; modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); module.l = true; return module.exports; } __webpack_require__.m = modules; __webpack_require__.c = installedModules; __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(module) { var getter = module && module.__esModule ? function getDefault() { return module['default']; }: function getModuleExports() { return module; }; __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(module, exports, __webpack_require__) { //main.js let { greeter, USER_INFO } = __webpack_require__(1); console.log(USER_INFO); document.querySelector("#root").appendChild(greeter()); }), (function(module, exports) { // Greeter.js exports.greet = function() { var greet = document.createElement('div'); greet.textContent = "Hi there and greetings!"; return greet; }; exports.USER_INFO = "userInfo"; }) ]);
首先最為層是包裹著立即執(zhí)行函數(shù)(加粗的內(nèi)容),參數(shù)是一個(gè)數(shù)組,數(shù)組中每一項(xiàng)是對應(yīng)的模塊,每個(gè)模塊包裹在 (function(module, exports, __webpack_require__) {//模塊內(nèi)容 });
立即執(zhí)行函數(shù)運(yùn)行執(zhí)行 return __webpack_require__(__webpack_require__.s = 0);
也就是執(zhí)行傳入數(shù)組中的第一個(gè)模塊main.js
將運(yùn)行后的每個(gè)模塊掛載到installedModules = {}
上,當(dāng)下個(gè)需要這個(gè)模塊直接返回當(dāng)前模塊,不在運(yùn)行代碼塊了!
接下來將require改為import看看打包后的如何實(shí)現(xiàn)
我們將 Greeter.js的信息改為如下 :
// Greeter.js export default function() { var greet = document.createElement('div'); greet.textContent = "Hi there and greetings!"; return greet; }; export const USER_INFO = "userInfo"; main.js 文件中的代碼,修改后 //main.js import greet,{USER_INFO} from './Greeter.js'; console.log(USER_INFO); document.querySelector("#root").appendChild(greet());
然后我們再次打包:
(function(modules) { var installedModules = {}; function __webpack_require__(moduleId) { if (installedModules[moduleId]) { return installedModules[moduleId].exports; } var module = installedModules[moduleId] = { i: moduleId, l: false, exports: {} }; modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); module.l = true; return module.exports; } __webpack_require__.m = modules; __webpack_require__.c = installedModules; __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(module) { var getter = module && module.__esModule ? function getDefault() { return module['default']; }: function getModuleExports() { return module; }; __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(module, __webpack_exports__, __webpack_require__) { "use strict"; Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); var __WEBPACK_IMPORTED_MODULE_0__Greeter_js__ = __webpack_require__(1); //main.js console.log(__WEBPACK_IMPORTED_MODULE_0__Greeter_js__["a"]); document.querySelector("#root").appendChild(Object(__WEBPACK_IMPORTED_MODULE_0__Greeter_js__["b"])()); }), (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_exports__["b"] = (function() { var greet = document.createElement('div'); greet.textContent = "Hi there and greetings!"; return greet; });; const USER_INFO = "userInfo"; __webpack_exports__["a"] = USER_INFO; })]);
總結(jié)
以上所述是小編給大家介紹的JavaScript中使用import 和require打包后實(shí)現(xiàn)原理分析,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
javaScript 計(jì)算兩個(gè)日期的天數(shù)相差(示例代碼)
本篇文章主要介紹了javaScript 計(jì)算兩個(gè)日期的天數(shù)相差(示例代碼) 需要的朋友可以過來參考下,希望對大家有所幫助2013-12-12微信小程序如何實(shí)現(xiàn)精確的日期時(shí)間選擇器
這篇文章主要介紹了微信小程序如何實(shí)現(xiàn)精確的日期時(shí)間選擇器,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01JavaScript高級程序設(shè)計(jì) 閱讀筆記(二十) js錯(cuò)誤處理
語法錯(cuò)誤,也稱解析錯(cuò)誤,發(fā)生在傳統(tǒng)語言的編譯時(shí),在JavaScript中發(fā)生在解釋時(shí),運(yùn)行時(shí)錯(cuò)誤也稱為異常(exception,在編譯期/解釋器后)2012-08-08基于BootStrap Metronic開發(fā)框架經(jīng)驗(yàn)小結(jié)【一】框架總覽及菜單模塊的處理
這篇文章主要介紹了基于BootStrap Metronic開發(fā)框架經(jīng)驗(yàn)小結(jié)【一】框架總覽及菜單模塊的處理的相關(guān)資料,小編認(rèn)為非常具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧2016-05-05JS克隆,屬性,數(shù)組,對象,函數(shù)實(shí)例分析
這篇文章主要介紹了JS克隆,屬性,數(shù)組,對象,函數(shù),結(jié)合實(shí)例形式分析了javascript中面向?qū)ο蟪绦蛟O(shè)計(jì)相關(guān)的對象、屬性、函數(shù)及數(shù)組等相關(guān)技巧,需要的朋友可以參考下2016-11-11