以前使用ES6写代码,webpack打包后上线,一点问题没有,也看过打包后的代码,长的很乱,也没敢看看咋回事,加载后就是能运行!javascript
今天经过个例子理解一下打包前,和打包后的代码!html
index.html
文件)。接下来咱们再建立三个文件:index.html
--放在public文件夹中;Greeter.js
-- 放在app文件夹中;main.js
-- 放在app文件夹中;此时项目结构以下图所示java
咱们在index.html文件中写入最基础的html代码,它在这里目的在于引入打包后的js文件(这里咱们先把以后打包后的js文件命名为bundle.js
,以后咱们还会详细讲述)。webpack
<!-- 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
中定义一个返回包含问候信息的html
元素的函数,并依据CommonJS规范导出这个函数为一个模块:web
// 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模块
返回的节点插入页面。typescript
//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);
})(
//============方法参数========//
//这是自执行函数的方法传参,参数是一个数字包含 main.js模块,Greeter.js模块
[
(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";
})
]
);复制代码
首先最为层是包裹着当即执行函数(加粗的内容),参数是一个数组,数组中每一项是对应的模块,每一个模块包裹在(function(module, exports, __webpack_require__) {//模块内容});浏览器
函数自执行时定义 缓存
var installedModules = {};//缓存加载后的模块,再次引入时直接获取
复制代码
定义 function __webpack_require__(){}
挂载静态属性和方法
__webpack_require__.m = modules;
__webpack_require__.c = installedModules;
__webpack_require__.d = function(exports, name, getter) {
//...
};
__webpack_require__.n = function(module) {
//...
};
__webpack_require__.o = function(object, property) {
//...
};
__webpack_require__.p = "";
复制代码
而后执行:bash
return __webpack_require__(__webpack_require__.s = 0);复制代码
var module = installedModules[moduleId] = {
i: moduleId,
l: false,
exports: {}
};
modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);复制代码
(function(module, exports, __webpack_require__) {
//这里是main.js模块
let {
greeter,
USER_INFO
} = __webpack_require__(1);
console.log(USER_INFO);
document.querySelector("#root").appendChild(greeter());
})复制代码
var module = installedModules[moduleId] = {
i: moduleId,
l: false,
exports: {}
};
modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); 复制代码
exports={
greet:function() {
var greet = document.createElement('div');
greet.textContent = "Hi there and greetings!";
return greet;
},
USER_INFO:"userInfo"
}复制代码
咱们将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;
})]
);复制代码
能够发现执行过程和上面require同样,先 __webpack_require__(__webpack_require__.s = 0)
即执行main.js模块:
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"])());
}复制代码
与require不一样的是新增__esModule属性,代表是js export定义的模块,引入方式也是不一样的
require引入的直接是整个module.exports对象,每次都是先总体引入对象,定义变量获取里面的属性
import 直接获取__WEBPACK_IMPORTED_MODULE_0__Greeter_js__["a"]属性值
编译前:都是先将没给模块头尾包装,进行做用域隔离,经过传入module,module.exports,require作为参数调用获取模块,并缓存模块
(function(module, __webpack_exports__, __webpack_require__) {
//模块代码
})复制代码