纯TypeScript开发Web前端(三)项目的模块化加载

题外话

        前两天,我平生第一次被人催更,虽然是个伪粉丝,但还是有那么一点点小兴奋。“TypeScript”这一系列,从实际的订阅数据上看非常尴尬,比起vue.js的系列差好远。脚手架(or 手脚架)框架盛行的世界,我的这个东西,便像是一株不合群的奇葩傲立于世间,除了孤芳自赏,剩下就是自娱自乐。
        No,No,No。。。。前面这一段并不是丧气的话,只是表明我个人玩技术的一种固有心态,便是“自娱自乐”!

正题

        其实,我这几天把业余时间都放在了重构这个TS的Demo项目上。准备把项目弄得相对完整些,并且把代码优化得能够入得了大家的眼后,才逐步把其中的过程和思路剖析出来给大家看。不过,既然有人等不及,我就继续来写边边角角用于填坑的内容吧。

模块化(Module)

  • 首先,什么是模块化?
    我的理解:系统功能的拆解归类抽象化而形成的功能区块,然后把这些区块的功能组合起来便形成一套完整的系统解决方案了。我的模块化的依据是OO(Object Oriented,面向对象)。

  • 为什么要模块化?不模块化可以吗?
    模块化代码可读性更强,好维护,重用方便。至于模不模块化看实际项目情况,功能简单结构单一的其实也没什么好模块化的;如果是比较复杂的系统,建议还是弄一下的好,不然假设再1个ts里面堆上一百几十个类,几千行代码,谁看了谁都会骂娘,程序员何苦为难程序员呢?

我的模块设计

假设,我要做一个用户查询产品的系统。模块划分如下:

    src/
    ├── app.ts
    ├── libs/
    │   └── router.ts
    ├── modules/
    │   ├── product/
    │   │   ├── index.ts
    │   │   ├── list.ts
    │   │   └── detail.ts
    │   └── user/
    │       ├── index.ts
    │       ├── login.ts
    │       └── info.ts
    └── utils/
        ├── http.ts
        ├── ui.ts
        └── cache.ts

说明一下,我的demo是web前端,所以modules下对应每个文件对应的是一个页面功能。index.ts除外!index.ts作为模块聚合导出的入口来用的。例如:

import { List } from "./list";
import { Detail } from "./detail";

export { Detail, List };

然后,在app.ts里的import就可以这样:

import * as Product from "./modules/product/index";
var listPage = new Product.List();

require.js加载模块

        说完模块化,趁热打铁就说一下模块的加载。其实,上一篇最后提到过,我是用require.js来做编译后的js的加载。众所周知,require.js是javascript模块加载的AMD派系的代表。早前的项目我也用过,比较熟所以就选它了。
        被加载的模块的写法,这里直接略过。因为在tsconfig.json里面module设为amd的话,tsc编译后就会自动生成对应的格式,我们几乎感觉不到。
        按照上面的项目模块结构,我只需要在index.html引入require.js,然后加载的入口指向app.js便可,也就是下面data-main这一段。

<script src="//cdn.staticfile.org/require.js/2.3.6/require.min.js" data-main="scripts/app"></script>

app.js 会按照app.ts 的各项 import 把 模块间的引用关系和次序都弄好,用起来非常非常的轻松。
        对于第三方的js库,就要借助require.config来配置一下(没错,上一片有提到过)。可以把这个脚本写在html文件底部,也可以独立弄一个js文件<script>引用进页面。对于外部第三方的库最好,用shim配置建立一个依赖的关系,避免网络原因,所依赖第三方库没有先加载导致脚本报错。

require.config({
    paths: {
        'jquery': '//g.alicdn.com/sj/lib/jquery/dist/jquery.min',
        'marked': '/js/libs/marked.min'
    },
   shim: {
            'app': {
                deps: ['jquery']
            }
        }
});

模块的发布

        细心的读者可能会数一下,我这么一个超简单的Demo项目都已经有十多个js了。那么一个真正的项目岂不是得有上百个js文件?!HTTP请求会吓死人的!冒昧地下个结论,看到这里会吃鲸的很定是新手。因为,老鸟们会很淡定的说,打包起来就完事了嘛~
        是的,这里先卖个关子,打包发布的内容留到下一讲,敬请期待~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容