webpack目前是前端模块化中重要的一块,和gulp不同的是,gulp是根据流来打包的,webpack是一个模块打包工具。
本次,先从最简单的打包结果来分析。
webpack.config.js
之后的打包结果都基于该配置进行打包
const path = require('path')const HtmlWebpackPlugin = require('html-webpack-plugin')module.exports = {devtool: 'none',mode: 'development',entry: './src/index.js',output: {filename: 'build.js',path: path.resolve('dist')},plugins: [new HtmlWebpackPlugin({template: './src/index.html'})]}
单个js文件时
src目录下的index.js仅有两行代码
console.log('进入了')module.exports = '首页'
打包后结果代码
// modules => 立即执行传递的参数(function(modules) {// 缓存对应module返回的值var installedModules = {};// 核心函数function __webpack_require__(moduleId) {// 如果存在缓存,直接返回缓存的值if(installedModules[moduleId]) {return installedModules[moduleId].exports;}// module对象var module = installedModules[moduleId] = {i: moduleId,l: false,exports: {}};// 绑定对应的this并传参执行// 会对module.exports进行赋值modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);// Flag the module as loadedmodule.l = true;// 返回module.exportsreturn module.exports;}// 保存传入的函数__webpack_require__.m = modules;// 保存缓存的值__webpack_require__.c = installedModules;// 入口函数// 传入入口对象./src/index.jsreturn __webpack_require__(__webpack_require__.s = "./src/index.js");})({/*** 立即执行函数* 传入的对象*/"./src/index.js":(function(module, exports) {console.log('进入了')// 此时会给module.exports赋值module.exports = '首页'})});
多个js文件时
// demo.jsexport default 'this is demo'// index.jsimport demo from './demo';console.log('进入了')console.log(demo)
打包后结果代码。由此可以得出,如果是多个文件,会修改module.exports中的值。当其他文件访问时,再访问module.exports的值
(function(modules) {// 缓存对应module返回的值var installedModules = {};// 核心函数function __webpack_require__(moduleId) {// 如果存在缓存,直接返回缓存的值if(installedModules[moduleId]) {return installedModules[moduleId].exports;}// module对象var module = installedModules[moduleId] = {i: moduleId,l: false,exports: {}};// 绑定对应的this并传参执行// 会对module.exports进行赋值modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);// Flag the module as loadedmodule.l = true;// 返回module.exportsreturn module.exports;}// 保存传入的函数__webpack_require__.m = modules;// 保存缓存的值__webpack_require__.c = installedModules;// 如果是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 });};// 入口函数// 传入入口对象./src/index.jsreturn __webpack_require__(__webpack_require__.s = "./src/index.js");})({// demo.js"./src/demo.js":(function(module, __webpack_exports__, __webpack_require__) {"use strict";// 即module.export.default = 'this is demo'__webpack_exports__["default"] = ('this is demo');}),// index.js"./src/index.js":(function(module, __webpack_exports__, __webpack_require__) {"use strict";// 声明export.modulevar _demo__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./demo */ "./src/demo.js");console.log('进入了')// 输出module.export.defaultconsole.log(_demo__WEBPACK_IMPORTED_MODULE_0__["default"])})});
由此可以得出,webpack默认使用的是commonJs规范。如果是commomJs规范,则直接使用module;如果是EsModule,则先需要进行标记为EsModule,并绑定default。因此,单从性能考虑,使用module.export比export default更佳。
