簡(jiǎn)單說(shuō)說(shuō)angular.json文件的使用
在Angular CLI 6+
的版本后,原先的angular-cli.json
就被換成了angular.json
,而其中里面的字段變化挺大了,如果不了解基本的組成,或者直接把老版本的代碼 copy 到新版本的工作空間中,會(huì)導(dǎo)致一些很不友好的錯(cuò)誤。
這種變化主要還是因?yàn)?code>Angular CLI引入了 monorepo
(一個(gè)空間管理多個(gè)項(xiàng)目) 的開(kāi)發(fā)模式,即使用ng new
出來(lái)的相當(dāng)于一個(gè)大的工作空間,通過(guò)angular.json
配置來(lái)管理各種ng generate application | library
出來(lái)的項(xiàng)目或組件庫(kù)。
其實(shí)這種模式優(yōu)勢(shì)還是很明顯的,比如一個(gè)公司有多種管理平臺(tái)或者產(chǎn)品時(shí),使用這種方式可以統(tǒng)一各個(gè)項(xiàng)目的環(huán)境,各個(gè)項(xiàng)目間共用的組件也被統(tǒng)一維護(hù)起來(lái),所有項(xiàng)目共用npm
包以及typescript
配置。
monorepo
下結(jié)構(gòu)如:
但是其實(shí)大多數(shù)人還是一個(gè)工作空間維護(hù)一個(gè)項(xiàng)目,所以這個(gè)在這里不那么重要,只是想說(shuō)json
文件的改變是為了新的模式而已。
Angular.json
的部分字段
當(dāng)你ng new
一個(gè)工作空間時(shí),默認(rèn)會(huì)在根目錄創(chuàng)建一個(gè)項(xiàng)目以及對(duì)應(yīng)e2e
項(xiàng)目。初始的angular.json
結(jié)構(gòu)如下(省略的部分的配置代碼)
{ "$schema": "./node_modules/@angular/cli/lib/config/schema.json", "version": 1, "newProjectRoot": "projects", "projects": { "xxxx": { "root": "", "sourceRoot": "src", "projectType": "application", "prefix": "app", "schematics": {}, "architect": {} } }, "defaultProject": "xxxx" }
這是部分的配置屬性,我按照順序簡(jiǎn)單做個(gè)記錄,以后也好查閱。
$schema
指向一個(gè) JSON Schema 文件,這個(gè)文件描述了angular.json
所有的字段以及約束。
其實(shí)可以比作一個(gè)有“類型提示”功能文件,只要支持了這個(gè)功能的 IDE 或編輯器,在書(shū)寫angular.json
文件時(shí)便會(huì)給出相應(yīng)的提示。
version
設(shè)置版本
newProjectRoot
新建項(xiàng)目所在的路徑。
當(dāng)使用ng generate application | library
創(chuàng)建一個(gè)新的項(xiàng)目時(shí),會(huì)自動(dòng)裝配到設(shè)定的newProjectRoot
目錄下
projects
放置所有項(xiàng)目的配置。其中一個(gè)項(xiàng)目為一個(gè)子項(xiàng),如xxxx
為一個(gè)項(xiàng)目,在創(chuàng)建時(shí)自動(dòng)生成。
{ "projects": { "xxxx": { "root": "", "sourceRoot": "src", "projectType": "application", "prefix": "app", "schematics": {}, "architect": {} } } }
在一個(gè)單獨(dú)的配置中,可以通過(guò)靈活的配置實(shí)現(xiàn)一些自動(dòng)化操作還有使用CLI
內(nèi)置的一些指令。
root
代表項(xiàng)目的“根目錄”,也就是項(xiàng)目所在的位置,或者說(shuō)項(xiàng)目源碼的父級(jí)目錄。項(xiàng)目的根目錄包含了一些特定的配置。
sourceRoot
項(xiàng)目源碼所在的目錄,通常默認(rèn)使用src
目錄。
projectType
標(biāo)示這個(gè)項(xiàng)目是application
還是library
prefix
使用ng generate component | directive
生成組件或者指令時(shí)默認(rèn)的selector
前綴,通常我們使用命令創(chuàng)建的組件或指令都是app-xxx
格式,我們可以手動(dòng)在這里改動(dòng),使整個(gè)項(xiàng)目生效。
schematics
CLI
中生成組件、指令、模塊等文件的指令是使用@angular-devkit/schematics
實(shí)現(xiàn)的,這些指令通常帶有一些快捷配置,比如一個(gè)生成組件的命令:ng g c --spec=false --styleext=scss
,這條命令可以直接生成一個(gè) 不帶測(cè)試文件、使用scss
為樣式文件 的組件。如果每次都要手動(dòng)輸入這些配置就會(huì)顯得麻煩,所以angular.json
提供了schematics
屬性來(lái)統(tǒng)一設(shè)置一些生成類的命令配置。
這里的schematics
是針對(duì)單個(gè)project
來(lái)的。整個(gè)angular.json
也有此字段,默認(rèn)生效于所有project
。
CLI
預(yù)設(shè)了幾組選項(xiàng),我們可以針對(duì)不同的選項(xiàng)進(jìn)行配置:
- @schematics/angular:component
- @schematics/angular:class
- @schematics/angular:directive
- @schematics/angular:guard
- @schematics/angular:module
- @schematics/angular:pipe
- @schematics/angular:service
拿component
舉例,如果要實(shí)現(xiàn)統(tǒng)一ng g c --spec=false --styleext=scss
的效果,可以配置如下:
{ "schematics": { "@schematics/angular:component": { "styleext": "less", "spec": false } } }
接著就可以直接使用ng g c
直接生成對(duì)應(yīng)的組件了。
architect
包含幾組CLI
相關(guān)的項(xiàng)目自動(dòng)化命令配置,比如本地運(yùn)行、編譯、測(cè)試等等。默認(rèn)預(yù)設(shè)了幾組命令配置如build
、serve
等等:
{ "architect":{ "build":{}, "serve":{}, "extract-i18n":{}, "test":{}, "lint":{} } }
配置屬性
每一個(gè)配置項(xiàng)都有 3 個(gè)字段屬性:builder
,options
,configurations
,例如默認(rèn)的build
命令配置:
{ "architect": { "build": { "builder": "@angular-devkit/build-angular:browser", "options": { "outputPath": "dist/testApp", "index": "src/index.html", "main": "src/main.ts", "polyfills": "src/polyfills.ts", "tsConfig": "src/tsconfig.app.json", "assets": [ "src/favicon.ico", "src/assets" ], "styles": [ "src/styles.css" ], "scripts": [] }, "configurations": { "production": { "fileReplacements": [ { "replace": "src/environments/environment.ts", "with": "src/environments/environment.prod.ts" } ], "optimization": true, "outputHashing": "all", "sourceMap": false, "extractCss": true, "namedChunks": false, "aot": true, "extractLicenses": true, "vendorChunk": false, "buildOptimizer": true } } } } }
這個(gè)是項(xiàng)目默認(rèn)生成的配置。
builder
代表要執(zhí)行的內(nèi)置程序,因?yàn)?code>CLI內(nèi)置了一些自動(dòng)化工具,architect
只是提供了一個(gè)facade
模式(通俗地講,就是開(kāi)發(fā)者不需要知道內(nèi)部的復(fù)雜實(shí)現(xiàn))給開(kāi)發(fā)者配置使用,本質(zhì)上還是調(diào)用的內(nèi)置工具。
options
代表針對(duì)當(dāng)前builder
要配置的配置項(xiàng),調(diào)用不同的內(nèi)置程序,是需要傳對(duì)應(yīng)的配置項(xiàng)的,由于配置項(xiàng)很多,這里也不會(huì)列出。
configurations
代表這個(gè)命令的多種調(diào)用模式,在此配置里,我們可以定義不同的別名,然后使用不同的配置(配置的字段還是屬于options
里的),最后在使用命令時(shí)便可以手動(dòng)選擇不同的模式。
如何使用
CLI
其實(shí)內(nèi)置了幾個(gè)快捷命令來(lái)對(duì)應(yīng)默認(rèn)生成的配置如ng serve
、ng build
等等,如果是我們額外自定義的配置,則可以使用ng run <project>:<architect>[:configurations] [其他配置]
命令來(lái)實(shí)現(xiàn),其中project
和architect
為必填,configurations
為選填。
比如我們簡(jiǎn)單額外自定義一個(gè)本地運(yùn)行的服務(wù)器命令:
{ "architect":{ "myServe":{ "builder": "@angular-devkit/build-angular:dev-server", "options": { "browserTarget": "xxxx:build", "port": 8800 }, "configurations": { "port1": { "port": 8801 }, "port2": { "port": 880 } } } } }
配置使用了內(nèi)置的運(yùn)行本地服務(wù)器程序,然后使用默認(rèn)的build
配置,加上自定義的運(yùn)行端口,另外加上兩個(gè)不同模式,運(yùn)行不同端口。
使用ng run xxxx:myServe
可以正常運(yùn)行本地服務(wù)器跑項(xiàng)目,端口是8800
使用ng run xxxx:myServe:port1
端口是8801
當(dāng)然,我們還可以直接使用額外的命令行配置直接覆蓋已經(jīng)定義的配置:
ng run xxxx:myServe:port1 --port=8808
這里的例子只是為了簡(jiǎn)單了解下architect
的用法。
defaultProject
默認(rèn)項(xiàng)目,當(dāng)使用一些CLI
命令沒(méi)有指定項(xiàng)目名稱時(shí),默認(rèn)指向的項(xiàng)目。
schema.json
其實(shí)我只是為了記錄自己有點(diǎn)印象的屬性,整個(gè)angular.json
還有很多其他的字段,如果想要全面了解,我們可以直接打開(kāi)$schema
所指向的文件,里面詳細(xì)地展示了各種字段的類型、配置以及描述說(shuō)明。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Angularjs自定義指令實(shí)現(xiàn)三級(jí)聯(lián)動(dòng) 選擇地理位置
這篇文章主要介紹了Angularjs自定義指令實(shí)現(xiàn)三級(jí)聯(lián)動(dòng),選擇地理位置,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02AngularJS實(shí)現(xiàn)controller控制器間共享數(shù)據(jù)的方法示例
這篇文章主要介紹了AngularJS實(shí)現(xiàn)controller控制器間共享數(shù)據(jù)的方法,結(jié)合簡(jiǎn)單實(shí)例形式分析了AngularJS控制器數(shù)據(jù)共享的實(shí)現(xiàn)方法,需要的朋友可以參考下2017-10-10詳解關(guān)于Angular4 ng-zorro使用過(guò)程中遇到的問(wèn)題
這篇文章主要介紹了詳解關(guān)于Angular4 ng-zorro使用過(guò)程中遇到的問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12Angular2利用組件與指令實(shí)現(xiàn)圖片輪播組件
這篇文章主要給大家介紹了Angular2中組件與指令的一個(gè)小實(shí)踐,利用組件和指令實(shí)現(xiàn)一個(gè)圖片輪播組件的相關(guān)資料,文中給出了詳細(xì)的介紹和示例代碼,需要的朋友可以參考學(xué)習(xí),下面來(lái)一起看看吧。2017-03-03Angular實(shí)現(xiàn)模版驅(qū)動(dòng)表單的自定義校驗(yàn)功能(密碼確認(rèn)為例)
這篇文章主要介紹了Angular實(shí)現(xiàn)模版驅(qū)動(dòng)表單的自定義校驗(yàn)功能(密碼確認(rèn)為例),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-05-05Angularjs中三種數(shù)據(jù)的綁定策略(“@”,“=”,“&”)
在AngularJS的指令中存在著三種綁定策略,他們分別是’=’,’@’,’&’。下面這篇文章主要介紹了Angularjs中這三種數(shù)據(jù)的綁定策略,有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。2016-12-12Angular CLI在Angular項(xiàng)目中如何使用scss詳解
angular-cli自身支持Scss預(yù)處理器,Scss比css更加方便靈活,而且層次清晰,代碼整潔。下面這篇文章主要給大家介紹了關(guān)于Angular CLI在Angular項(xiàng)目中如何使用scss的相關(guān)資料,需要的朋友可以參考下。2018-04-04