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 文件)。接下來我們?cè)賱?chuàng)建三個(gè)文件:
- index.html --放在public文件夾中;
- Greeter.js -- 放在app文件夾中;
- main.js -- 放在app文件夾中;
此時(shí)項(xiàng)目結(jié)構(gòu)如下圖所示
項(xiàng)目結(jié)構(gòu)
我們?cè)?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>
我們?cè)?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)是對(duì)應(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());
然后我們?cè)俅未虬?
(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)原理分析,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
原生JS封裝_new函數(shù)實(shí)現(xiàn)new關(guān)鍵字的功能
這篇文章主要介紹了原生JS封裝_new函數(shù),實(shí)現(xiàn)new關(guān)鍵字的功能 ,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08
js實(shí)現(xiàn)數(shù)組內(nèi)數(shù)據(jù)的上移和下移的實(shí)例
下面小編就為大家?guī)硪黄猨s實(shí)現(xiàn)數(shù)組內(nèi)數(shù)據(jù)的上移和下移的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11
javascript針對(duì)cookie的基本操作實(shí)例詳解
這篇文章主要介紹了javascript針對(duì)cookie的基本操作,結(jié)合實(shí)例形式較為詳細(xì)的分析了JavaScript操作cookie的基本技巧,并給出了一個(gè)JavaScript操作cookie的完整類,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11
ThreeJS從創(chuàng)建場(chǎng)景到使用功能實(shí)例詳解
threejs是一個(gè)用于在瀏覽器中繪制3D圖像的JS庫,它是基于webgl實(shí)現(xiàn)了,包括了webgl1和webgl2的渲染引擎,下面這篇文章主要給大家介紹了關(guān)于ThreeJS從創(chuàng)建場(chǎng)景到使用功能的相關(guān)資料,需要的朋友可以參考下2022-08-08
頁面縮放兼容性處理方法(zoom,Firefox火狐瀏覽器)
下面小編就為大家?guī)硪黄撁婵s放兼容性處理方法(zoom,Firefox火狐瀏覽器)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08
webpack開發(fā)環(huán)境和生產(chǎn)環(huán)境的深入理解
這篇文章主要介紹了webpack開發(fā)環(huán)境和生產(chǎn)環(huán)境的深入理解,詳細(xì)的介紹了什么是開發(fā)環(huán)境和生產(chǎn)環(huán)境并配置,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-11-11
JavaScript中json對(duì)象和string對(duì)象之間相互轉(zhuǎn)化
json對(duì)象和string對(duì)象之間的轉(zhuǎn)化已經(jīng)成為了大家耳熟能詳?shù)脑掝},本人今天就多啰嗦一些他們之間的故事,如有不對(duì)之處,還請(qǐng)各位海涵呢?不多說了直切主題2012-12-12

