Angularjs启动过程

Angularjs的启动过程分析 本文介绍了Angularjs的启动过程分析,分享给大家 启动过程(v1.3.9) 步骤一 用自执行函数的形式让整个代码在加载完成之后立即执行 in angular.js Line6 (function(window, document, undefined) 在window上暴露一个唯一的全局对象angular,Line250  angular = window.angular || (window.angular = {})  获得其它工具模块 Line 2129 function publishExternalAPI(angular) { extend(angular, { 立即下载

启动过程(v1.3.9)

步骤一
  • 用自执行函数的形式让整个代码在加载完成之后立即执行
    in angular.js Line6

      (function(window, document, undefined)
  • 在window上暴露一个唯一的全局对象angular,Line250

      angular = window.angular || (window.angular = {})
  • 获得其它工具模块 Line 2129

      function publishExternalAPI(angular) {
        extend(angular, {
          'bootstrap': bootstrap,
          'copy': copy,
          'extend': extend,
          'equals': equals,
          'element': jqLite,
          'forEach': forEach,
          'injector': createInjector,
          'noop': noop,
          'bind': bind,
          .....
  • 我们来看看angular全局对象都有什么东西

  • 接着,我们使用全局对象中的isFunction 来遍历一下angular全局对象上的属性,函数

      var counter = 0;
      for (var p in angular) {
          counter++;
          if (angular.isFunction(angular[p])) {
              console.log("function->" + p);
          } else {
              console.log("property-->" + p + "-->" + angular[p]);
          }
      }
      console.log(counter);

有两个property,其它都是function


  • 我们再来看看injector里都有什么

      /**
       * angular.injector();
       */
      var injector = angular.injector();
      console.log(injector);

一共有5个方法
annotate:分析函数签名(不要new的原因)


步骤二
  • 检查是不是多次导入Angular:window.angular.bootstrap(通过检查指定的元素上是否已经存在injector进行判断)

    in angular.js line 26041

      if (window.angular.bootstrap) {
        //AngularJS is already loaded, so we can return here...
        console.log('WARNING: Tried to load angular more than once.');
        return;
      }

angular的三种启动方式

  • 自动启动

    Angular会自动的找到ng-app,将它作为启动点,自动启动

      <!DOCTYPE html>
      <html ng-app="myModule">
    
      <head>
          <title>New Page</title>
          <meta charset="utf-8" />
          <script type="text/javascript" src="../../vendor/bower_components/angular/angular.min.js"></script>
          <script type="text/javascript" src="./02.boot1.js"></script>
      </head>
    
      <body>
          <div ng-controller="MyCtrl">
              <span>{{Name}}</span>
          </div>
      </body>
      </html>
    js
    
      var myModule = angular.module("myModule", []);
      myModule.controller('MyCtrl', ['$scope',
          function($scope) {
              $scope.Name = "Puppet";
          }
      ]);
  • 手动启动

    在没有ng-app的情况下,只需要在js中添加一段注册代码即可
    
      <body>
          <div ng-controller="MyCtrl">
              <span>{{Name}}</span>
          </div>
      </body>

    js

      var myModule = angular.module("myModule", []);
      myModule.controller('MyCtrl', ['$scope',
          function($scope) {
              $scope.Name = "Puppet";
          }
      ]);
    
      /**
       * 这里要用ready函数等待文档初始化完成
       */
      angular.element(document).ready(function() {
          angular.bootstrap(document, ['myModule']);
      });
  • 多个ng-app

    ng中,angular的ng-app是无法嵌套使用的,在不嵌套的情况下有多个ng-app,他默认只会启动第一个ng-app,第二个第三个需要手动启动(注意,不要手动启动第一个,虽然可以运行,但会抛异常)

      <body>
          <div id="app1" ng-app="myModule1">
              <div ng-controller="MyCtrl">
                  <span>{{Name}}</span>
              </div>
          </div>
          <div id="app2" ng-app="myModule2">
              <div ng-controller="MyCtrl">
                  <span>{{Name}}</span>
              </div>
          </div>
      </body>

    js

      /**
       * 第一个APP
       * @type {[type]}
       */
      var myModule1 = angular.module("myModule1", []);
      myModule1.controller('MyCtrl', ['$scope',
          function($scope) {
              $scope.Name = "Puppet";
          }
      ]);
      // angular.element(document).ready(function() {
      //     angular.bootstrap(app1, ['MyModule1']);
      // });
    
      /**
       * 第二个APP
       * @type {[type]}
       */
      var myModule2 = angular.module("myModule2", []);
      myModule2.controller('MyCtrl', ['$scope',
          function($scope) {
              $scope.Name = "Vincent";
          }
      ]);
      angular.element(document).ready(function() {
          angular.bootstrap(app2, ['myModule2']);
      });
步骤三

尝试绑定jQuery,如果发现导入了jQuery ,则使用导入的jQuery,否则,使用Angular自己封装的JQLite

in angular.js line 1521:

bindJQuery();

in angular.js line 1534:

  jQuery = window.jQuery;

if (jQuery && jQuery.fn.on) {
    jqLite = jQuery;
    extend(jQuery.fn, {
      scope: JQLitePrototype.scope,
      isolateScope: JQLitePrototype.isolateScope,
      controller: JQLitePrototype.controller,
      injector: JQLitePrototype.injector,
      inheritedData: JQLitePrototype.inheritedData
    });

测试

<html ng-app="myModule">


<body>
    <div>
        <div ng-controller="MyCtrl">
            <span>{{Name}}</span>
        </div>
    </div>
</body>

</html>

js

var myModule = angular.module("myModule", []);
myModule.controller('MyCtrl', ['$scope',
    function($scope) {
        $scope.Name = "Puppet";
    }
]);

查看执行流程


步骤四

发布ng提供的API

in angular.js line 2162 : publishExternalAPI(angular);

//构建模块加载器
angularModule = setupModuleLoader(window);
  try {
    angularModule('ngLocale');
  } catch (e) {
    angularModule('ngLocale', []).provider('$locale', $LocaleProvider);
  }

模块加载器的实现原理

in angular.js function setupModuleLoader(window)

function setupModuleLoader(window) {

  var $injectorMinErr = minErr('$injector');
  var ngMinErr = minErr('ng');

  function ensure(obj, name, factory){
  return obj[name] || (obj[name] = factory());
  }
  var angular = ensure(window, 'angular', Object);
  // We need to expose `angular.$$minErr` to modules such as `ngResource` that reference it during bootstrap
  angular.$$minErr= angular.$ $minErr || minErr;
  //把module方法放到angular的全局对象上,ensure就是一个属性拷贝的过程
return ensure(angular, 'module', function(){
    //模块缓存
    var modules = {};
}

把工具函数给载到模块里

return function module(name, requires, configFn) {
......
}

查看模块里所包含的内容

<!DOCTYPE html>
<html ng-app="myModule">

</html>

JS

/**
 * 定义模块
 */
var myModule = angular.module("myModule", []);

/**
 * 从debug的过程可以看到,angular中的“模块”只是一个闭包空间(或者叫命名空间)
 * 所有模块都被注册在modules这个对象上
 */
console.log(myModule);

查看控制台


构建内置模块ng

in angular.js line 2169 publishExternalAPI(angular)

 angularModule('ng', ['ngLocale'], ['$provide',
    function ngModule($provide) {
      // $ $sanitizeUriProvider needs to be before $compileProvider as it is used by it.
      $provide.provider({
        $ $sanitizeUri: $$SanitizeUriProvider
      });
      $provide.provider('$compile', $CompileProvider).
        directive({
            a: htmlAnchorDirective,
            input: inputDirective,
            ......

加载了所有内置的directive,provider.注册ng内核Provider:两个最重要的$parser 和 $rootScope

总结

  1. 工具函数拷贝到angular全局对象上;
  2. 调用setupModuleLoader方法创建模块定义和加载工具(挂在全局对象window.angular上);
  3. 构建内置模块ng;
  4. 创建ng内置的directive和provider;
  5. 两个重要的provider:$parse 和 $rootScope;
步骤五

初始化Angular - 查找Ng-app

  jqLite(document).ready(function() {
    angularInit(document, bootstrap);
  });

bootstrap

创建injector,拉起内核和启动模块,调用compile服务
(一个ng-app只有一个injector)
in angular.js line 1415

function bootstrap(element, modules, config){
....
}


作者:易sense
链接:http://www.jianshu.com/p/d805f599fda5
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
AngularJS执行流程详解 一.启动阶段 浏览器解析HTML页面,读取到angular.js的[removed]标签后会停止解析后面的DOM节点,开始执行angular.js,与此同时,Angular会设置一个事件监听器来监听DOMContentLoaded事件,当Angular监听到这个事件后,Angular就启动了。 二.初始化阶段 Angular启动后,它会查找ng-app指令,然后初始化一系列必要的组件(即$injector、$compile服务以及$rootScope),接着继续解析DOM。 三.编译、链接阶段 1.Angular使用$compile服务通过遍历DOM树的方式查找带有指令的DOM元素,然后根据指令 立即下载

相关推荐

Flowable高级篇 -6.8.0 最全表结构说明-主要表结构字段注释

flowable 28张表 详细

billzhen的博客 1万+

AngularJS的启动引导过程

1.引导之前:库阶段 在示例中,我们定义了一个指令ez-duang, 它应该会展开成一个动画 显示出来。AngularJS代码: angular.module("ezstuff",[]) .directive("ezDuang",function(){ return { restrict : "E",

timeless的博客 1708

FPGA实现16x16点阵汉字滚动显示:Verilog代码与Quartus仿真详解

本文详细介绍了如何使用FPGA实现16x16点阵汉字滚动显示,包括Verilog代码设计、Quartus仿真及硬件连接技巧。通过字模数据存储和扫描控制逻辑,实现汉字的动态显示效果,并提供了优化建议和常见问题解决方案,适合FPGA开发者和硬件爱好者学习参考。

weixin_29172963的博客 352

angularJS的启动方法

angular的三种启动方式 方式1: 自动启动 Angular会自动的找到ng-app,将它作为启动点,自动启动 &lt;!DOCTYPE html&gt; &lt;html ng-app="myModule"&gt; &lt;head&gt; &lt;title&gt;New Page&lt;/title&gt; &lt;meta charset="

fengxfengx的博客 871

JHU ICBM DTI Atlas纤维束模板介绍

JHU ICBM DTI atlas 纤维束的定位与功能介绍

machinelearning_er的博客 6426

Halcon实战:5种边缘检测算子对比(Sobel、Roberts、Prewitt、Kirsch、Canny)

本文深入对比了Halcon中Sobel、Roberts、Prewitt、Kirsch和Canny五大边缘检测算子的实战表现与核心差异。通过工业图像实例与代码解析,提供了基于噪声水平、边缘连续性及实时性要求的场景化选型指南,帮助工程师精准选择最适合的算子以优化视觉检测流程。

weixin_29266007的博客 392

AngularJS 的启动过程分析

本文例子所使用版本为 v1.3.9 启动过程 步骤1 用自执行函数的形式让整个代码在加载完成之后立即执行 inangular.js Line6 javascript(function(window, document, undefined) 在window上暴露一个唯一的全局对象angular,Line250 ...

weixin_34255055的博客 188

【Verilog基础】CDC跨时钟域方法,典型异步电路设计之脉冲同步器(上)

【Verilog基础】CDC跨时钟域方法,典型异步电路设计之脉冲同步器(上):慢时钟域到快时钟域!

悟已往之不谏 知来者之可追 1545

Angularjs启动安装过程

AngularJS诞生于2009年,由Misko Hevery 等人创建,后为Google所收购。是一款优秀的前端JS框架,已经被用于Google的多款产品当中。AngularJS有着诸多特性,最为核心的是:MVVM、模块化、自动化双向数据绑定、语义化标签、依赖注入等等。详情见官网:https://www.angularjs.net.cn/tutorial/2.1安装node.js 下载地址:https://nodejs.org/en/download/2.2.安装npm和cnpm npm在安装node.j

Java_sanlin的博客 1099

数字信号处理----数字上变频和下变频都FPGA实现

** 数字信号处理基础----信号下变频和解调 一、 任务介绍 数字上变频器(DUC)和数字下变频器(DDC)广泛应用于通信系统,用于信号采样速率的转换。当信号从基带转换至中频( IF )带,需要使用数字上变频器。而数字下变频器是用于将信号从中频( IF )带转换为基带。DUC和DDC通常包括使用混频器进行频率转换,此外还有采样率转换。DUC或DDC的结构主要取决于所需要的转换率。例如,WiMAX (全球互通微波接入)系统典型的转换率为8—10阶。对于如此低的转换率,DUC和DDC只需采用FIR滤波器架构。

Born_toward的博客 3万+

在 TASKPROCESSING 上为 ABAP OData 服务添加多个系统别名:从原理到落地的完整实践

本文面向SAP Gateway与ABAP开发者,详细讲解如何在TASKPROCESSING OData服务上添加系统别名。首先介绍了系统别名的概念与设计初衷,阐述了添加别名的业务场景需求,包括多系统接入、用户分流和灰度发布等。随后提供了标准配置步骤,从SPRO路径到具体操作说明,并分享了三个实际案例说明如何实现跨区域统一待办、按用户角色分流和灰度发布。最后给出了验证方法和常见问题解决方案,帮助开发者掌握这项基础但关键的配置技能,实现服务路由的可控管理。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 137

Angular项目启动步骤

初学者启动angular 项目

csdn122325735的专栏 8081

Electron - Electron failed to install correctly, please delete node_modules/electron and try install

Electron安装失败:Electron failed to install correctly, please delete node_modules/electron and try installing again,electron安装报错:Electron failed to install correctly...解决方案,Electron 未能正确安装,请删除 node_modules/electron,然后再次尝试安装,如何解决这个问题,手把手教你解决,在yarn dev时报错,electr

🏆 前端领域优质创作者 4368

AngularJS的启动过程分析

AngularJS的启动过程分析 本文例子所使用版本为 v1.3.9 启动过程 步骤1 用自执行函数的形式让整个代码在加载完成之后立即执行 inangular.js Line6 (function(window, document, undefined) 在window上暴露一个唯一的全局对象angular,Line250 /** @name angular

timeless的博客 555

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

浅谈AngularJS启动引导过程

我们都知道AngularJS默认会执行app.js来启动整个angular项目,但你知道angular具体执行过程吗? 一、自动引导启动框架 例如我们有如下代码,我们想要完成一个指令功能: <html ng-app> <head> <script src="angular.min.js"></scri...

andao1961的博客 147

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

AngularJS启动过程分析

AngularJS启动过程分析 1111 app.controller('myCtrl',['$scope',function($scope){     $scope.wcrq=1234567890; }]); angular.bootstrap(document,['myApp']);   一定要在控制器后面启动,否...

LHL62411570的专栏 243

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

AngularJS:应用的启动和执行过程

启动(startup): <!doctype html> <html ng-app> <head> <script src="http://code.angularjs.org/angular-1.1.0.min.js"></script> </head> <body> <p ng-init=" name='World' ">Hello {{name}}!</p> &l

laurel_y的博客 930

AngularJS进阶(三十九)基于项目实战解析ng启动加载过程

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基于项目实战解析ng启

mm2zzyzzp的博客 182

ionic+angularJs的App启动过程

Ionic既是一个CSS框架也是一个Javascript UI库。许多组件需要Javascript才能产生神奇的效果,尽管通常组件不需要编码,通过框架扩展可以很容易地使用,Ionic 是目前最有潜力的一款 HTML5 手机应用开发框架。通过 SASS 构建应用程序,它 提供了很多 UI 组件来帮助开发者开发强大的应用。 它使用 JavaScript MVVM 框架和 AngularJS 来增强

陈大牛的博客 3264

AngularJS启动过程

用户输入网址,浏览器从服务器端加载html文件 浏览器对html文件进行解析 遇到加载angular.js的script标签,停止对与html的解析,开始加载angularjs的源码(主要做了6件事情) 3.1.创建angular全局变量 3.2.检查是否重复加载angualrjs源码,如果重复加载则在在控制台打印日志并返回 3.3.绑定jQuery 3.3.1.检查是否加载jquery.

Itellboy 1099

AngularJS进阶 三十九 基于项目实战解析ng启动加载过程

AngularJS进阶 三十九 基于项目实战解析ng启动加载过程

qq_43667184的博客 311
上一篇: 生成某个范围内N个不重复随机数与生成固定长度数组
下一篇: Angular 组件间通信
SunsCheung
博客等级 码龄11年 30粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值