webpack打包之无依赖模块
一、入口文件main.js
// main.js
console.log('webpack');
二、出口文件bundle.js
1、浏览代码
2、本质
// 实际就是一个自执行函数
(function(modules) {
//...
})([function(module,exports){
console.log('webpack');
}])
这个自执行函数接收一个参数,这个参数是一个模块数组,这个数组里存放我们打包的入口模块,以及这个模块的依赖模块,在这里我们没有依赖模块。
三、代码解读
1、定义一个对象
用来缓存加载进来的模块(加载进来和加载完毕是两个概念)。
// The module cache
/******/ var installedModules = {};
2、声明一个函数
用来加载模块。该函数接收一个moduleId为参数,moduleId就是webpack打包时,你在命令行看到的最下面一行打包文件的详细信息的最开头的数字。

function __webpack_require__(moduleId) {
//...
}
下面,进入该函数内部继续分析。
A、检查函数是否被缓存
为了防止重复打包,这里需要检查该函数是否已经被加载了,进而保证每个模块只会被加载一次。
// Check if module is in cache
if(installedModules[moduleId]) {
return installedModules[moduleId].exports;
}
B、创建一个module对象
该对象有3个属性,i是index的缩写,表示moduleid;l是loaded的缩写,表示是否已经被加载;exports是对象,用来加载依赖。
// Create a new module (and put it into the cache)
var module = installedModules[moduleId] = {
i: moduleId,
l: false,
exports: {}
};
C、执行传进来的模块
因为main.js没有任何依赖模块,因此,该模块函数没有第三个参数,__webpack_require__也不会被传进去。
// Execute the module function
modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
D、修改l的值,返回module.exports
// Flag the module as loaded
module.l = true; // Return the exports of the module
return module.exports;
3、为函数添加属性方法
A、m(module)的赋值
// expose the modules object (__webpack_modules__)
__webpack_require__.m = modules;
B、c(cache)的赋值
// expose the module cache
__webpack_require__.c = installedModules;
C、d的赋值,更改当前加载进来的模块的属性配置
进入该方法前,判断了一下__webpack_require__上是否有o方法,来确定加载进来的模块是否是入口模块,因为入口模块总是被第一个加载进来,o方法会在d方法后面被定义。
// 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
/******/ });
/******/ }
/******/ };
D、n的赋值,根据模块加载机制的不同做出不同的响应,module.__esModule为es6模块加载机制。
// 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;
/******/ };
E、o的赋值,包装一下Object.prototype.hasOwnProperty。
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
F、p的赋值
// __webpack_public_path__
/******/ __webpack_require__.p = "";
4、返回函数
// Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 0);
四、总结
对于没有依赖模块的模块来说,上面说的几乎没用。毕竟webpack是用来进行模块打包的,只有一个模块,webpack的作用就发挥不了了。
webpack打包之无依赖模块的更多相关文章
- webpack打包之有依赖js模块
一.入口文件main.js var isd = require('./depend.js'); if(isd.isDepend){ console.log('有依赖模块'); } else { con ...
- webpack打包之有依赖es2015模块
一.入口文件main.js import { isDepend } from './depend.js'; import { fn } from './depend2.js'; if(isDepend ...
- webpack打包和gulp打包工具详细教程
30分钟手把手教你学webpack实战 阅读目录 一:什么是webpack? 他有什么优点? 二:如何安装和配置 三:理解webpack加载器 四:理解less-loader加载器的使用 五:理解ba ...
- 性能优化 - 查看 webpack 打包后所有的依赖关系(webpack 可视化工具)
查看 webpack 打包后所有组件与组件间的依赖关系,针对多余的包文件过大, 剔除首次影响加载的效率问题进行剔除修改,本次采用的是 ==webpack-bundle-analyzer(可视化视图查看 ...
- 基于ES6模块标准通过webpack打包HTM5项目
本篇主要演示通过webpack打包phaser项目,webpack安装方法在此处就不一一赘述了 经常用phaser来写html5游戏的朋友可能会发现,当游戏场景比较多时,如果都写在一个js文件中那么将 ...
- 前端项目模块化的实践2:使用 Webpack 打包基础设施代码
以下是关于前端项目模块化的实践,包含以下内容: 搭建 NPM 私有仓库管理源码及依赖: 使用 Webpack 打包基础设施代码: 使用 TypeScript 编写可靠类库 使用 TypeScript ...
- Webpack 打包优化之速度篇
在前文 Webpack 打包优化之体积篇中,对如何减小 Webpack 打包体积,做了些探讨:当然,那些法子对于打包速度的提升,也是大有裨益.然而,打包速度之于开发体验和及时构建,相当重要:所以有必要 ...
- Webpack打包进阶
说在前面 由于使用了React直出,页面各项性能指标使人悦目.本篇将深入探讨目前PC部落所采用webpack打包优化策略,以及探讨PC部落并未使用的 webpack Code Splitting 代码 ...
- webpack打包avalon
webpack打包avalon+oniui+jquery 随着avalon的发展壮大,我根据CSDN的统计数字,中国前端大概有1%的人在使用avalon了. avalon的最大优势是能兼容IE6,并且 ...
随机推荐
- 【kafka】confluent_kafka重置offset
之前写过两篇关于重置offset的博文,后来使用过程中都有问题. 经过各种尝试,终于找到了解决方案. 直接上代码: # coding=utf8 from confluent_kafka import ...
- 【mysql】datetime时间比较
如下,比较的日期用指定格式写出就可以了.不需要日期函数. SELECT * FROM table_a WHERE write_date > "2017-07-17 00:00:00&q ...
- 基于Web的漏洞利用
1.Nikto 基于Web的漏洞信息扫描 nikto 自动扫描web服务器上没有打补丁的软件,同时同时也检测驻留在服务器上的危险文件,nikto能够识别出特定的问题,检测服务器的配置问题, 检测某台主 ...
- 小学生都看得懂的C语言入门(5): 指针
现在已经学到C语言的后面了, 快学完咯.... (一)取地址运算 先来看一下sizeof 计算所占字节 #include<stdio.h> int main() { int a; a=; ...
- cf862d 交互式二分
/* 二分搜索出一个01段或10即可 先用n个0确定1的个数num 然后测试区间[l,mid]是否全是0或全是1 如果是,则l=mid,否则r=mid,直到l+1==r 然后再测试l是1还是r是1 如 ...
- Chrome浏览器常用键盘快捷键介绍
很多人喜欢使用键盘快捷键来操作电脑,因为在熟练的情况下,使用键盘会比使用鼠标点击更快.更高效.本文对Chrome浏览器常用的快捷键做个说明. 标签页和窗口快捷键 1. Ctrl + n 打开新窗口 ...
- spring集成jwt验证方式,token验证
为什么要告别session?有这样一个场景,系统的数据量达到千万级,需要几台服务器部署,当一个用户在其中一台服务器登录后,用session保存其登录信息,其他服务器怎么知道该用户登录了?(单点登录), ...
- C++ Primer 笔记——函数
1.函数内的局部静态对象在程序的执行路径第一次经过对象定义语句的时候初始化,并且直到程序终止才被销毁,在此期间即使对象所在的函数结束执行也不会对它有影响. size_t get_count() { ; ...
- 论文阅读笔记十三:The One Hundred Layers Tiramisu: Fully Convolutional DenseNets for Semantic Segmentation(FC-DenseNets)(CVPR2016)
论文链接:https://arxiv.org/pdf/1611.09326.pdf tensorflow代码:https://github.com/HasnainRaz/FC-DenseNet-Ten ...
- UI开发总结
1. bootstrap tooltip 修改内容 <i class="ace-icon fa fa-user" id="test-tooltip" ti ...