ionic3 开发之工作原理(目录结构、文件分析)及懒加载介绍

onic3.x 目录结构分析

执行命令ionic start myApp tabs 生成ionic3项目myApp后,用vsCode打开项目可以看到项目中:

  • node_modules //node 各类依赖包
  • resources //android/ios 资源(更换图标和启动动画)
  • src //开发工作目录,页面、样式、脚本和图片都放在这个目录下
  • www //静态文件
  • platforms //生成 android 或者 ios 安装包路径( platforms\android\build\outputs\apk:apk 所在位置)
  • plugins // 已安装的cordova插件(通过ionic cordova plugins ls查看,通过ionic cordova plugins add/remove 插件名或路径来添加/删除)
  • config.xml //打包成 app 的配置文件,也就是原生项目配置文件
  • package.json //node安装模块时的依据文件,配置项目的元数据和管理项目所需要的依赖, 在里面配置的内容,在执行npm install命令后会生成到node_modules目录。
  • tsconfig.json //TypeScript 项目的根目录,指定用来编译这个项目的根文件和编译选项
  • tslint.json //格式化和校验 typescript

src目录详细介绍

src目录:工作目录,开发完成后通过ionic的命令行生成为原始的静态html页面,并存放在www目录,也就是说www在开发过程中是不需要理的,可以任意删除。

当我们想打包app时,命令行执行打包指令会生成一个调用浏览器插件的原生项目,同时把www目录拷贝到项目中,浏览器插件的入口网页指向www的index.html,从而在app中实现本地浏览网页的效果。

其中页面和脚本等因为是本地的就不需要网上加载,在数据加载过程中就已经可以看到页面,等数据加载完成自动局部刷新页面即可,这就是ionic的运行机理

src 下面文件分析:

  • app:入口文件夹

    -app.component.ts:入口页的业务逻辑(根组件);

    -app.html:入口页的html模板;

    -app.module.ts:入口模块配置, 告诉Angular如何编译和启动应用程序;

    -app.scss:入口页的样式(全局样式);

    -main.ts:启动模块入口;

  • assets:样式、图片、字体、脚本等静态文件;
    pages:开发页面,含html、ts、css;
    theme:主题文件夹,里面可以放置多个主题文件,方便切换主题;

  • components:自定义组件(公用、可复用模块);
    directives:自定义指令(注入到组件上为组件添加功能);
    pipes:自定义管道(用于格式化显示数据);
    providers:自定义服务(工具类、业务处理类等等);

了解IonicModule之前,我们需要先看下NgModule与@NgModule 装饰器:

NgModule是angular(这里不再详细介绍)框架的概念。

  • 一个NgModule描述如何将应用程序各部分组合在一起。每个应用程序都至少有一个Angular module,即启动应用程序时引导的根模块。

  • @NgModule decorator将AppModule标识为NgModule类。@NgModule接受一个元数据对象,该对象告诉Angular如何编译和启动应用程序。

  • NgModule 的元数据会做这些:
    * 声明某些组件、指令和管道属于这个模块。
    * 公开其中的部分组件、指令和管道,以便其它模块中的组件模板中可以使用它们。
    * 导入其它带有组件、指令和管道的模块,这些模块中的元件都是本模块所需的。
    * 提供一些供应用中的其它组件使用的服务。

@NgModule 装饰器:

  • @NgModule 装饰器表明 AppModule 是一个 NgModule 类。 @NgModule 获取一个元数据对象,它会告诉 Angular 如何编译和启动本应用。元数据对象关键字段:

    *declarations —— 声明属于这个模块的组件,指令,管道等等. 声明后就可以在这个模块中使用它们了.
    *imports —— 导入需要依赖的一些其他的模块,比如 BrowserModule 以获取浏览器特有的服务,比如 DOM 渲染、无害化处理和位置(location)。
    *providers —— 各种共用的服务。
    *bootstrap —— 指定了这个模块启动的时候应该启动的组件.当然这些组件会被自动的加入到entryComponents中去,Angular 创建它并插入 index.html 宿主页面。

IonicModule与IonicPageModule

了解了NgModule以后,IonicModule与IonicPageModule就好解释了。

  • IonicModule是一个引导Ionic应用程序的NgModule。

  • IonicPageModule是一个NgModule,它引导子IonicPage以设置路由。

回头我们再好好看下@NgModule中的这些属性:

declarations

  • 模块的声明数组告诉Angular哪些组件属于该模块。
  • 当创建更多的组件时,将它们添加到声明中。如果您使用组件而不声明它,则角返回一条错误消息。
  • 声明数组只接受可声明的内容:组件、指令(directive)和管道(pipe)。
  • 声明必须只属于一个模块。如果试图在多个模块中声明同一个类,则编译器会发出错误。
  • 这些已声明的类在模块中是可见的,但在不同模块中的组件是不可见的,除非它们是从这个模块导出,而另一个模块导入这个模块。

entryComponents(入口组件):

  • 这些组件将会在这个模块定义的时候进行编译 , Angular会为每一个组件创建一个ComponentFactory然后把它存储在ComponentFactoryResolver
  • There are two main kinds of entry components:
  • The bootstrapped root component.
  • A component you specify in a route definition.
  • Angular 必须加载的组件是入口组件
  • 引导组件是在引导过程(应用程序启动)中加载到DOM的入口组件。其他入口组件通过其他方式动态加载,例如使用路由器。
  • 大多数应用开发者都不需要把组件添加到 entryComponents 中。
  • Angular 会自动把恰当的组件添加到入口组件中。 列在 @NgModule.bootstrap 中的组件会自动加入。 由路由配置引用到的组件会被自动加入。 用这两种机制添加的组件在入口组件中占了绝大多数。

bootstrap:

  • the root component that Angular creates and inserts into the index.html host web page.
  • @NgModule.bootstrap 属性告诉编译器这是一个入口组件,同时它应该生成一些代码来用该组件引导此应用。

ionic关键之页面:IonicPage

  • Ionic 页面基于url注册和显示页面详情,当页面被NavController推出来的时候,URL将被更新,以匹配到此页面的路径。
  • 与传统的web应用程序不同,url在Ionic应用程序中不指定导航。相反,url帮助我们链接到特定的内容片段。当我们导航时,会更新当前URL。
  • 我们将我们的URL系统称为深层链接系统,而不是路由器,以鼓励Ionic开发人员将URL视为面包屑(内容片段),而不是真正的导航。

ionic3.x懒加载实现:

官方介绍在这里
懒加载是ionic3.x的新特性,Lazy Loading 可以在初始化时只加载一些必要的代码,非必要的代码分离出来在需要加载的时候再加载之,理论上能让应用加快一定的启动速度。

下面以MyPage的加载为例,懒加载的实现:
第一步:设置深度链接: IonicPageModule中添加此页面,IonicPageModule.forChild用于导入页面模块
@NgModule({
  declarations: [ MyPage ],
  imports: [
  IonicPageModule.forChild(MyPage)
 ],
   entryComponents: [
   MyPage
]
 })
export class MyPageModule {}
第二步:将@IonicPage decorator添加到组件中。最简单的用法是添加一个空的decorator:
@IonicPage()
@Component({
   templateUrl: 'main.html'
})
export class MyPage {}

这将自动创建一个链接到MyPage组件,使用与类名称相同的名称:“MyPage”。@IonicPage() 等同于:@IonicPage({‘MyPage’})
@IonicPage decorator接受了一个DeepLinkMetadataType对象。此对象接受以下属性:name, segment, defaultHistory, and priority.。所有这些都是可选的,但是可以用来创建复杂的导航链接。

第三步:使用这个名称导航到该页面了。例如:
@Component({
   templateUrl: 'another-page.html’
 })
export class c {
   constructor(public navCtrl: NavController) {}
    goToMyPage() {
         // go to the MyPage component
        this.navCtrl.push('MyPage');
     }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_X自主阅读 15,982评论 3 119
  • 1 Webpack 1.1 概念简介 1.1.1 WebPack是什么 1、一个打包工具 2、一个模块加载工具 3...
    Kevin_Junbaozi阅读 6,673评论 0 16
  • 很久没有写文章了,一方面生活琐事没调整过来,另一方面最近忙了一个比较繁琐的项目。在这个项目里使用了ueditor,...
    小前seant阅读 1,339评论 0 0
  • 2018.4.8周末,晴三年级十二班李淑颖麻麻 清明假期结束开学的第一天,由于三天的清明假又养成了晚睡晚起的习惯,...
    lsy颖阅读 209评论 0 1
  • 城乡之壤 不记得什么时候,刹那间熟悉的眼神定格的画面,那是属于乡村的无知与期待,那只属于乡里的灵动与实诚,好久不见...
    沉淀123阅读 187评论 0 0