微信小程序 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 &#39;ejs&#39;的解决办法  图册素材网站设计制作软件,图册的导出方式有几种?  如何在七牛云存储上搭建网站并设置自定义域名?  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应用技巧【教程】