rn打包原来是packager,后来独立出一个专门的打包工具metro,构建工具的大体思路跟前端构建工具差不多,都会有一个启动文件,然后根据模块依赖关系把对应文件找到。

开发中打包

在开发中打包,我们访问的是一个index.bundle,这个时候跟其他的前端构建工具一致,都是会启动一个node 服务,metro提供了一个createServer方法,这个方法结合http(s)模块构建出一个可以提供bundle文件的服务器,当然可以其他的node框架,比如express:

const express = require('express');
const app = express(); app.use(
metroBundlerServer.processRequest.bind(metroBundlerServer),
); app.listen(8081);

我们可以在浏览器中输入http://localhost:8081/index.bundle?platform=ios&dev=true

那么这个bundle文件就会被返回,而metroServer会提供几个方法来提供返回内容,可以是bundle也可以是其他静态资源,这里我们访问的是bundle,那么就会使用processRequestBundle方法,这个方法会根据访问的url去找对应的js文件,然后打包成bundle文件



所以这里的虚拟目录根目录就是项目根目录,我们可以独立的去访问某个目录下js文件,都会为我们打包成bundle文件返回。

bundle文件

这里简单分析下bundle文件,我们简单的翻一下整个文件,就可以发现,前面除了第一行是设置环境变量,其他都是一些自执行函数,后面的全是_d函数,大致也可以猜出来,_d函数就是模块定义函数。我们看前面的函数,第一个自执行函数里面有个很熟悉的东东,_d函数找到了,它被挂在到global下,在这个函数中把模块加载相关做了定义。



模块的id是一个createModuleIdFactory方法,然后我们看到第一个定义的模块id是从11开始的,这是因为之前的polyfill文件生成也在调用这个函数。

function createModuleIdFactory() {
const fileToIdMap = new Map();
let nextId = 0;
return path => {
let id = fileToIdMap.get(path);
if (typeof id !== 'number') {
id = nextId++;
fileToIdMap.set(path, id);
}
return id;
};
}

而后面的几个函数我们可以看到都是各种es6语法的polyfill,其中有个函数很特别,先是定义了一个inspect函数,里边大量的数据类型判断,之后重新定义了console方法,这里其实是对console做了polyfill,但是由于rn的打印错误信息跟浏览器有不一致,所以前面会有很多数据类型判断,来保持跟浏览器控制台中打印的一致。



之后的紧接着就是我们的项目启动模块,但是之后的就是rn、react以及其他依赖项目的模块,一致到所有的公共模块加载完才是我们的业务模块。

本地打包

本地打包也就是打包出实实在在的bundle文件,而不是虚拟目录下,命令使用这里就不说了,这里要注意的一点就是,如果你想在某个目录下存放你的bundle文件,这个目录一定要存在,metro不会帮你去创建目录。这个时候调用依然会是metro的server,只不过最终会输出bundle文件到指定目录。

打包后的bundle文件跟开发中的结构是一致的,但是我们仔细看就会发现模块id变少了,前面的polyfill文件一样的,都是第一个模块ID都是11,也就是启动文件,那么就是中间的模块便少了,其实就是一些公共模块做了合并,所以看起来少了。

总结

基本来说只要rn和react等基础包版本不变,那么打包出来的bundle文件公共部分就是相同的,这里也利于我们进行基础包也业务包的分离。

rn打包分析的更多相关文章

  1. H264码流打包分析(精华)

    H264码流打包分析 SODB 数据比特串-->最原始的编码数据 RBSP 原始字节序列载荷-->在SODB的后面填加了结尾比特(RBSP trailing bits 一个bit“1”)若 ...

  2. create-react-app 搭建的项目中,引入 webpack-bundle-analyzer 打包分析

    安装npm intall webpack-bundle-analyzer --save-dev 在 config/webpack.config.prod.js 文件(推荐)或 config/webpa ...

  3. vue-cli、create-react-app 项目如何查看打包分析?

    vue-cli.create-react-app 项目如何查看打包分析? 项目 如何查看打包分析 vue-cli 创建的项目 已经集成 webpack-bundle-analyzer,运行npm ru ...

  4. webpack之打包分析以及prefetching和preloading

    打包分析: https://webpack.js.org/guides/code-splitting/#bundle-analysis        性能优化使用缓存是很有限的,现在更多的应该是再编写 ...

  5. RTP协议解析及H264/H265 音视频RTP打包分析

    一 概述 实时传输协议(Real-time Transport Protocol或简写RTP)是一个网络传输协议,它是由IETF的多媒体传输工作小组1996年在RFC 1889中公布的. RTP协议详 ...

  6. H264码流打包分析

    转自:http://www.360doc.com/content/13/0124/08/9008018_262076786.shtml   SODB 数据比特串-->最原始的编码数据 RBSP ...

  7. Unity编译Android的原理解析和apk打包分析

    作者介绍:张坤 最近由于想在Scene的脚本组件中,调用Android的Activity的相关接口,就需要弄明白Scene和Activity的实际对应关系,并对Unity调用Android的部分原理进 ...

  8. maven项目打包分析及打包后war包缺少配置文件报错的原因分析,使用progard混淆时配置分析

    1.maven打包: 一直以来我都没太注意过在myeclipse下使用run as来clean居然对项目的target目录没有进行操作,要让操作有效,需要进入到maven build...选项下,进行 ...

  9. RN打包的那些坑儿

    Write By lz: Lz 寄语: RN虐我千百遍, 我待RN如初恋, 坑儿爬多了也就自然了 官方文档: http://reactnative.cn/docs/0.43/signed-apk-an ...

随机推荐

  1. oracle数据库恢复归档脚本

    cat restorearch1.sh rman target / << EOFRUN {SET ARCHIVELOG DESTINATION TO '/archlog1/db2_arch ...

  2. 系统监控zabbix

    zabbix(音同 zæbix)是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让系统 ...

  3. php各种设计模式简单实践思考

    前言 我一直觉得什么框架,版本,甚至语言对于一个coder来说真的不算什么,掌握一个特别高大上的一个框架或者是一个新的,少众的语言真的不算什么,因为你可以,我要花时间也可以,大家都是这样的.所以基本的 ...

  4. Fiddler学习基础(一)

    Fiddler官方网站及下载地址:http://www.telerik.com/fiddler 1. Fiddler原理: 作为系统代理,所有的来自微软互联网服务(WinInet)的http请求再到达 ...

  5. DB2 编目并访问远程数据库

    之后将逐步对项目上的DB2相关经验做个总结,梳理一下知识结构. 要远程操作数据库,首先要进行编目,分三个步骤: 1. 在客户端建立服务器端数据库的节点,编目远程节点. 格式如下: 1. CATALOG ...

  6. TCP Congestion Control

    TCP Congestion Control Congestion occurs when total arrival rate from all packet flows exceeds R ove ...

  7. python 使用gRPC

    Python gRPC 简介 grpc 是google 开源的一款rpc服务框架,可以轻松的实现跨语言的微服务,将项目中的各个模块独立出来,单独部署,独立升级,也可以根据模块的情况进行不同语言的变成. ...

  8. window下安装composer

    1.什么是composer 一个智能的下载工具.比如说我的项目要安装yii框架,而yii是依赖于其他东西的,仅仅安装yii是不够的,这样会导致我的项目也不能正常运行:怎么办呢,我们可以一个一个手动的将 ...

  9. 轻量ORM-SqlRepoEx (八)MySQL、Sql Service 迁移

    数据库变更在编程应用中是常的,MySQL.Sql Service之间的数据迁移更为常见,在 SqlRepoEx2.0DemoForAspCore中演示了,这种数据库之间切换时SqlRepoEx是如何的 ...

  10. 基于多用户的Oracle数据泵导入导出数据

    登陆SqlPlus: SqlPlus sys/syspwd@MyOrcl AS sysdba 其中:syspwd:sys的登陆密码:MyOrcl:所创建的数据库服务名. 创建数据泵: create o ...