微信小程序 require机制详解及实例代码
发布时间 - 2026-01-10 21:49:37 点击率:次微信小程序 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的使用
# 微信小程序加载机制及运行机制图解
# 加载
# 递归
# 代理服务
# 是个
# 上了
# 什么时候
# 是由
# 很有
# 将其
# 这也
# 这就
# 希望能
# 采用了
# 可以看到
# 可以看出
# 什么呢
# 干了
# 谢谢大家
# 一提
# 轮到
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在阿里云购买域名并搭建网站?
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
详解jQuery中的事件
Laravel Docker环境搭建教程_Laravel Sail使用指南
Laravel如何配置任务调度?(Cron Job示例)
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
node.js报错:Cannot find module 'ejs'的解决办法
图册素材网站设计制作软件,图册的导出方式有几种?
如何在七牛云存储上搭建网站并设置自定义域名?
javascript中对象的定义、使用以及对象和原型链操作小结
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
如何在景安云服务器上绑定域名并配置虚拟主机?
Laravel如何使用Blade模板引擎?(完整语法和示例)
Laravel怎么实现支付功能_Laravel集成支付宝微信支付
如何在Windows 2008云服务器安全搭建网站?
如何在云主机上快速搭建多站点网站?
如何快速启动建站代理加盟业务?
文字头像制作网站推荐软件,醒图能自动配文字吗?
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
如何在阿里云虚拟服务器快速搭建网站?
Laravel Debugbar怎么安装_Laravel调试工具栏配置指南
Laravel如何使用Collections进行数据处理?(实用方法示例)
Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】
浅谈javascript alert和confirm的美化
jquery插件bootstrapValidator表单验证详解
UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】
在线制作视频的网站有哪些,电脑如何制作视频短片?
郑州企业网站制作公司,郑州招聘网站有哪些?
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
如何在景安服务器上快速搭建个人网站?
如何在IIS7中新建站点?详细步骤解析
JavaScript中的标签模板是什么_它如何扩展字符串功能
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
Laravel如何实现事件和监听器?(Event & Listener实战)
Laravel API资源类怎么用_Laravel API Resource数据转换
成都网站制作公司哪家好,四川省职工服务网是做什么用?
香港服务器网站卡顿?如何解决网络延迟与负载问题?
javascript基于原型链的继承及call和apply函数用法分析
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
北京网站制作公司哪家好一点,北京租房网站有哪些?
深圳网站制作培训,深圳哪些招聘网站比较好?
如何挑选高效建站主机与优质域名?
中山网站制作网页,中山新生登记系统登记流程?
Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】
Python结构化数据采集_字段抽取解析【教程】
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
如何续费美橙建站之星域名及服务?
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】

