全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

微信小程序 require机制详解及实例代码

微信小程序 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小时内与您取得联系。