angular PC 端框架搭建

angular 6 兼容性

了解angular不同版本支持浏览器情况,尤其是IE:
https://angular.io/guide/browser-support

angular6 cli 创建项目

npm install -g @angular/cli
ng new 代码库名
具体参考文档:https://github.com/angular/angular-cli/wiki

添加 rxjs-compat

angular 6使用的是RxJS 6,它带来了一些重大改变,但是可以通过添加rxjs-compat缓解这一问题,rxjs-compat软件包允许您在保持v5代码运行的同时逐渐迁移。
npm install rxjs-compat@6
还可以安装rxjs-tslint自动转成rxjs6。
npm install rxjs-tslint
建立 migrate.tslint.json

{
  "rulesDirectory": ["node_modules/rxjs-tslint"],
  "rules": {
    "update-rxjs-imports": true,
    "migrate-to-pipeable-operators": true,
    "collapse-rxjs-imports": true
  }
}

执行 tslint-fix
./node_modules/.bin/tslint -c migrate.tslint.json --project src/tsconfig.app.json --fix

具体内容:
RxJS 6有哪些新变化?
如何從 RxJS 5.x 升級至 RxJS 6

polyfill IE11(BA comfirm)

Angular CLI 创建的框架带了polyfill.ts文件,里面包含了一些通用的polyfill,根据需求打开一些polyfill。
Angular and Internet Explorer

prettier

添加prettier保持代码风格一致。prettier只关注格式化,并不具有lint检查语法等能力。
npm install prettier
在项目目录下添加一个文件.prettierrc

{
  "overrides": [
    {
      "files": ["**/*.ts", "**/*.js"],
      "options": {
        "parser": "typescript",
        "singleQuote": true,
        "printWidth": 100
      }
    },
    {
      "files": "**/*.scss",
      "options": {
        "parser": "css"
      }
    },
    {
      "files": "**/*.json",
      "options": {
        "parser": "json",
        "printWidth": 120
      }
    }
  ]
}

参考文档
vscode + prettier 专治代码洁癖

tslint 代码语法审查

angular-cli创建的项目自带了tslint,需要做的就是把规则和配置做些修改。

tslin.json文件是规则配置说明,能自动检查,并提示错误。配置项可参考官方文档:Configuring TSLint

我们之前已经使用了prettier。所以可以加上tslint-config-prettier 和tslint-plugin-prettier。

tslint.json

{
 "rulesDirectory": ["node_modules/codelyzer", "tslint-plugin-prettier"],
  "extend": ["tslint:latest", "tslint-config-prettier"],
  "rules": {
    "prettier": true,
.....
   }

}

tslint-plugin-prettier是把 Prettier 作为TSLint的一个规则加入到里面。

使用tslint:recommended(官方推荐配置)或tslint:latest(除了官方推荐的还有一些持续更新的内容),tslin-config-prettier会把原先lint配置里涉及到格式化的配置覆盖重写,其他lint同理,这个主要是解决prettier和tslint格式化冲突的问题。

把prettier加到pre-commit里,使用husky和pretty-quick

"husky": {
    "hooks": {
      "pre-commit": "pretty-quick --staged"
    }
  },

参考文档
用 ESLint 和 Prettier 写出高质量代码和tslint同理

apollo

http请求使用的是graphql,所以要安装apollo-angular。

    "graphql": "^0.13.2",
    "graphql-tag": "^2.9.2",
...//dev
    "apollo-angular": "^1.1.2",
    "apollo-angular-link-headers": "^1.1.0",
    "apollo-angular-link-http": "^1.1.1",
    "apollo-cache-inmemory": "^1.2.5",
    "apollo-client": "^2.3.5",
    "apollo-link-context": "^1.0.8",

具体请参考apollo-angular官方文档

反向代理

现在很多都是前后端分离的开发模式,所以前端经常会有跨域请求。使用代理以后所有http请求在浏览器看来都是同域请求,不再存在跨域问题。

找了一个关于反向代理的解释:反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

当前做的就是把api接口反向代理到graphql mock server:

  • 新加一个文件proxy.conf.json
{
  "/api": {
    "target": "http://127.0.0.1:8080/graphql",
    "secure": false
  }
}
  • 在angular.json中architect.serve.options添加一条proxyConfig
 "options": {
    "browserTarget": "cmbkb-portal-desktop:build",
    "proxyConfig": "./proxy.conf.json"
  },
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { ApolloModule, Apollo } from 'apollo-angular';
import { InMemoryCache } from 'apollo-cache-inmemory';
import { HttpLinkModule, HttpLink } from 'apollo-angular-link-http';
import { setContext } from 'apollo-link-context';
import { httpHeaders } from 'apollo-angular-link-headers';
import { AppComponent } from './app.component';
import { HttpClientModule } from '@angular/common/http';

@NgModule({
  declarations: [AppComponent],
  imports: [BrowserModule, ApolloModule, HttpLinkModule, HttpClientModule],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule {
  constructor(apollo: Apollo, httpLink: HttpLink) {
    const headers = httpHeaders();
    const http = httpLink.create({ uri: '/api' });
    apollo.create({
      link: headers.concat(http),
      cache: new InMemoryCache()
    });
  }
}

参考
angular-cli关于proxy的配置
基于angular-cli配置代理解决跨域请求问题

Jest

Jest 是跑测试的一个框架,比起angular自带的karma要快的多。

  • npm install jest jest-preset-angular --dev
  • 在package.json添加入口:
"jest": {
  "preset": "jest-preset-angular",
  "setupTestFrameworkScriptFile": "<rootDir>/src/setupJest.ts"
}

setupJest.ts

import 'jest-preset-angular';
import './jestGlobalMocks';

jestGlobalMocks.ts

const mock = () => {
  let storage = {};
  return {
    getItem: key => (key in storage ? storage[key] : null),
    setItem: (key, value) => (storage[key] = value || ''),
    removeItem: key => delete storage[key],
    clear: () => (storage = {})
  };
};

Object.defineProperty(window, 'localStorage', { value: mock() });
Object.defineProperty(window, 'sessionStorage', { value: mock() });
Object.defineProperty(window, 'getComputedStyle', {
  value: () => ['-webkit-appearance']
});

Object.defineProperty(window, 'URL', {
  value: {
    createObjectURL: () => {}
  }
});

  • 添加命令
"test": "jest",
"test:watch": "jest --watch",

具体配置可以参考testing-angular-faster-jest

UI 框架 - CDK

根据官方get-started引入CDK框架

图标(字体,inline-svg)

现在项目上大部分都偏好使用图标字体。有很多种办法可以实现。
当前使用的是 icon-font-generator 来构造font,并没有把它放进webpack打包流程中,而是分开。
其他方法还有inline-svg等等。

README

更新README

Submodule

有关联的库,可以作为submodule存在

Pipeline

配置流水线

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

推荐阅读更多精彩内容