微信小程序 require机制详解

一, JS模块加载:一次性加载全部JS, 但并不一定立即执行.
先提一提微信小程序架构: 类浏览器 -> HTTP本地服务 -> 云端服务
微信小程序运行的架构,基本上是浏览器 -> HTTP本地服务 -> 云端服务, HTTP本地服务用来读取本地文件或者代理云端的文件资源。读取项目中JS文件, 是由HTTP本地服务取本地存储的脚本文件.
似乎比较简单,一个HTML 引用所有JS文件
既然采用了这种架构,那微信小程序就类似浏览器那样,借助一个HTML页面来引用加载所有的JS文件。(注:这同NODE.JS的方式区别)
在小程序开发开具的HTTP服务部分代码,可以看到这个服务干了这件事情:
微信小程序包目录下面所有.js文件, 会按<script src="../xxx.js"> 方式插入生成一个HTML文件,然后类似浏览器方式加载.
让HTTP本地服务配合,对JS文件作的包装手法
可是事情并未结束,这种方式一加载,所有js文件都会立即执行,乱糟糟生成一团,怎么可能..那require函数又拿来干什么呢?原来这儿,HTTP服务在返回.JS文件内容的,给脚本内容包装上了一层: define函数
代理服务部分代码:
(projectManager.js)
function getScripts(projInfo, callback) {
...
fs.readFile(fname, 'utf8', function(err, scripts) {
....
scripts = 'define("' + moduleName + '", function(require, module, exports, ' + noBrowserStr +
'){ ' + scripts + '\n});',
needRequire && (scripts += 'require("' + moduleName + '")'), //page页面js文件,会添加上require自己,加载后立即初始化。
.....
callback(null, scripts) //scripts串内容作为HTTP GET的返回
define函数非常简单,大致如下:
......
var
......
moduleList = {};
define = function(moduleName, factory) { //define是全局函数,每个JS文件都默认会调用.
moduleList[moduleName] = { status: status1, factory: factory }
};
从上面代码看出,,这样一来,每加载一个JS文件,只是将其文件名与脚本内容串加入了内存中的一个变量保存,并未执行。 注意,这就与普通的HTML 脚本引用加载立即执行完全不同了.
接下来,就轮到微信小程序的require函数出场了。
二, JS模块初始化:按需递归式require初始化
先看看微信小程序require函数的定义:
....
require = function(moduleName) {
....
var module = moduleList[moduleName]; //define函数调用时为moduleList赋的值
.....
if (module.status === status1) {
//如果未初始化,则初始化
var factory = module.factory, //这个factory就是这个JS文件的脚本.
obj = { exports: {} }, u = void 0;
factory && (u = factory(o(moduleName), obj, obj.exports)), module.exports = obj.exports || u, module.status = status2
}
return module.exports
}
从上面可以看出, require函数只是通过模块名,从内存中获取脚本内容执行,并置标志以保证只执行一次.
再精简一下:
require --调用-> factory --->模块中可能再require另一个模块...
这样就是一个典型的递归结构。
三,补充一下:页面js 其实也是被require函数加载
所谓页面JS,,就是在app.json中注册的page的js, 它们并没有被其它JS require方式引用,
那么它们在什么时候初始化?
回到之前本地代理服务器的代码,留意下面一点:
代理服务部分代码:
(projectManager.js)
function getScripts(projInfo, callback) {
...
fs.readFile(fname, 'utf8', function(err, scripts) {
....
//page页面js文件,needRequire值为TRUE,会添加上require自己
needRequire && (scripts += 'require("' + moduleName + '")'),
.....
原来它们还是使用require函数初始化,而且是加载后立即执行。
目前通常微信小程序代码结构不会太复杂,但随着产品的发展,需求的增加, 代码结构可能越来越复杂,越来越注意模块化.同时,如何将旧有JS模块在微信小程序中重用,这也是个重要话题。 所以深入理解微信小程序的JS模块化机制也是很有价值的.
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# 微信小程序
# require机制详解
# require机制详细介绍
# require
# 微信小程序下拉加载和上拉刷新两种实现方法详解
# 微信小程序JS加载esmap地图的实例详解
# 微信小程序如何实现全局重新加载
# 小程序如何使用分包加载的实现方法
# 微信小程序如何获知用户运行小程序的场景教程
# 微信小程序 在Chrome浏览器上运行以及WebStorm的使用
# 微信小程序加载机制及运行机制图解
# 加载
# 递归
# 代理服务
# 是个
# 上了
# 什么时候
# 是由
# 很有
# 将其
# 这也
# 这就
# 希望能
# 采用了
# 可以看到
# 可以看出
# 什么呢
# 干了
# 谢谢大家
# 一提
# 轮到
相关文章:
建站之星如何助力网站排名飙升?揭秘高效技巧
如何用y主机助手快速搭建网站?
如何在阿里云虚拟主机上快速搭建个人网站?
建站之星如何配置系统实现高效建站?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
自助网站制作软件,个人如何自助建网站?
如何快速启动建站代理加盟业务?
临沂网站制作企业,临沂第三中学官方网站?
开源网站制作软件,开源网站什么意思?
建站与域名管理如何高效结合?
建站之星好吗?新手能否轻松上手建站?
三星网站视频制作教程下载,三星w23网页如何全屏?
建站之星免费模板:自助建站系统与智能响应式一键生成
如何在Windows服务器上快速搭建网站?
免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?
如何用景安虚拟主机手机版绑定域名建站?
如何在IIS7上新建站点并设置安全权限?
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
平台云上自主建站:模板化设计与智能工具打造高效网站
建站之星代理平台如何选择最佳方案?
网页设计网站制作软件,microsoft office哪个可以创建网页?
建站主机选购指南:核心配置与性价比推荐解析
招贴海报怎么做,什么是海报招贴?
如何续费美橙建站之星域名及服务?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
如何在云虚拟主机上快速搭建个人网站?
如何在阿里云服务器自主搭建网站?
学校为何禁止电信移动建设网站?
已有域名如何免费搭建网站?
如何在万网自助建站平台快速创建网站?
如何在阿里云ECS服务器部署织梦CMS网站?
如何快速重置建站主机并恢复默认配置?
建站之星如何开启自定义404页面避免用户流失?
企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?
广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?
制作宣传网站的软件,小红书可以宣传网站吗?
孙琪峥织梦建站教程如何优化数据库安全?
制作销售网站教学视频,销售网站有哪些?
建设网站制作价格,怎样建立自己的公司网站?
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
建站10G流量真的够用吗?如何应对访问高峰?
临沂网站制作公司有哪些,临沂第四中学官网?
建站之星CMS五站合一模板配置与SEO优化指南
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
建站上市公司网站建设方案与SEO优化服务定制指南
宝塔建站无法访问?如何排查配置与端口问题?
如何通过cPanel快速搭建网站?
建站主机SSH密钥生成步骤及常见问题解答?
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
*请认真填写需求信息,我们会在24小时内与您取得联系。