Angular CLIλ Angular μμ© νλ‘κ·Έλ¨μ μ΄κΈ°ν, κ°λ°, μ€μΊ ν΄λ© λ° μ μ§ κ΄λ¦¬νλ λ° μ¬μ©νλ λͺ λ Ή μ€ μΈν°νμ΄μ€ λꡬμ λλ€. λꡬλ₯Ό μ½μμμ μ§μ μ¬μ©νκ±°λ Angular μ½μκ³Ό κ°μ λν ν UIλ₯Ό ν΅ν΄ κ°μ μ μΌλ‘ μ¬μ©ν μ μμ΅λλ€.
Angular CLIλ₯Ό μν μ μ© λκ΅¬κ° λμμ΅λλ€. Angular μ½μμ΄λΌκ³ λΆλ¦
λλ€. μμ
μ κΈ°μ‘΄ μ½μμμ μ§ννλλ‘ νκ² μ΅λλ€. https://angularconsole.com/
λ Έλμ NPM λꡬλ₯Ό μ¬μ©νμ¬ Angular CLIλ₯Ό μ€μΉν©λλ€.
$ npm install -g @angular/cliλ²μ μ νμΈν©λλ€.
$ ng --version
_ _ ____ _ ___
/ \ _ __ __ _ _ _| | __ _ _ __ / ___| | |_ _|
/ β³ \ | '_ \ / _` | | | | |/ _` | '__| | | | | | |
/ ___ \| | | | (_| | |_| | | (_| | | | |___| |___ | |
/_/ \_\_| |_|\__, |\__,_|_|\__,_|_| \____|_____|___|
|___/
Angular CLI: 7.1.1
Node: 10.14.1
OS: win32 x64
Angular:
...
Package Version
------------------------------------------------------
@angular-devkit/architect 0.11.1
@angular-devkit/core 7.1.1
@angular-devkit/schematics 7.1.1
@schematics/angular 7.1.1
@schematics/update 0.11.1
rxjs 6.3.3
typescript 3.1.6μμ£Όμ°λ νμμ μΈ λͺ λ Ήμ΄λ₯Ό μ΄ν΄λ΄ λλ€.
μ μ΅κ·€λ¬ νλ‘μ νΈλ₯Ό μμ±ν©λλ€. λ€μκ³Ό κ°μ μμ μ΄ μ΄λ£¨μ΄μ§λλ€.
- κ°λ°μ νμν ν΄λ λ° νκ²½μ€μ νμΌλ€μ΄ μμ±λ©λλ€.
- λ£¨νΈ λͺ¨λ λ° κΈ°λ μ»΄ν¬λνΈκ° κΈ°λ³ΈμΌλ‘ μμ±λ©λλ€.
- package.json νμΌμ λνλμ λ΄μμ λ°λΌμ λΌμ΄λΈλ¬λ¦¬κ° λ€μ΄λ‘λ λ©λλ€.
νλ‘μ νΈ μμ± μ λΌμ°ν
λͺ¨λμ μΆκ°λ‘ λ§λ€κ²μΈμ§ λ¬Όμ΄λ΄
λλ€.
Would you like to add Angular routing? yes
νλ‘μ νΈ μμ± μ CSS κΈ°μ λ‘ λ¬΄μμ μ¬μ©ν κ²μΈμ§ μΆκ°λ‘ λ¬Όμ΄λ΄
λλ€.
Which stylesheet format would you like to use? scss
λλ΅μ΄ λλλ©΄ νλ‘μ νΈ μμ±μμ μ μμν©λλ€.
--minimal=true
creates a project without any testing frameworks.
ν μ€νΈμ κ΄λ ¨ν jasmine, karma, protractor λ±μ λνλμλ₯Ό μ μΈν©λλ€. κΈ°λ μ»΄ν¬λνΈμΈ AppComponentκ° μΈλΌμΈν νλ¦Ώ, μΈλΌμΈμ€νμΌ λ°©μμΌλ‘ μμ±λ©λλ€. μ μ»΄ν¬λνΈλ₯Ό μμ±νλ©΄ spec.ts νμΌμ μμ±λ©λλ€.
Default: false
package.json
"dependencies": {
"@angular/animations": "~7.1.0",
"@angular/common": "~7.1.0",
"@angular/compiler": "~7.1.0",
"@angular/core": "~7.1.0",
"@angular/forms": "~7.1.0",
"@angular/platform-browser": "~7.1.0",
"@angular/platform-browser-dynamic": "~7.1.0",
"@angular/router": "~7.1.0",
"core-js": "^2.5.4",
"rxjs": "~6.3.3",
"tslib": "^1.9.0",
"zone.js": "~0.8.26"
},
"devDependencies": {
"@angular-devkit/build-angular": "~0.11.0",
"@angular/cli": "~7.1.1",
"@angular/compiler-cli": "~7.1.0",
"@angular/language-service": "~7.1.0",
"@types/node": "~8.9.4",
"ts-node": "~7.0.0",
"tslint": "~5.11.0",
"typescript": "~3.1.6"
}--skipTests=true
When true, does not generate "spec.ts" test files for the new project.
ν μ€νΈμ κ΄λ ¨ν jasmine, karma, protractor λ±μ μ€μ μ ν¬ν¨λλ angular.json νμΌμ μ€μ μ μΆκ°νμ¬ spec.ts νμΌμ μμ±μ λ§μ΅λλ€. κ΄λ ¨νμ¬ angular.json νμΌμ μ€μ λλ λ΄μ©μ λ€μκ³Ό κ°μ΅λλ€.
Default: false
angular.json
"schematics": {
"@schematics/angular:component": {
"styleext": "scss",
"spec": false
},
"@schematics/angular:class": {
"spec": false
},
"@schematics/angular:directive": {
"spec": false
},
"@schematics/angular:guard": {
"spec": false
},
"@schematics/angular:module": {
"spec": false
},
"@schematics/angular:pipe": {
"spec": false
},
"@schematics/angular:service": {
"spec": false
}
},-
--prefix=prefix
The prefix to apply to generated selectors for the initial project.
μ»΄ν¬λνΈμ selector κ°μ μλμΌλ‘ λΆλ λλ¬Έμλ₯Ό λ³κ²½ν©λλ€. κ΄λ ¨ μ€μ μ angular.json νμΌμ"prefix": "app"νλͺ©μμ μ°Ύμ λ³Ό μ μμ΅λλ€.
Default: app -
--skipInstall=true
When true, does not install dependency packages.
νλ‘μ νΈ μ€μΊν΄λ© μμ ν package.json νμΌμ dependencies, devDependencies μ€μ μ λ°λ₯Έ λνλμ μ€μΉμμ μ μννμ§ μμ΅λλ€. λμ€μ μ§μ npm installλͺ λ ΉμΌλ‘ μ€μΉν μ μμ΅λλ€. 무μμ install ν μ§ λͺ μνμ§ μμΌλ©΄ μλμΌλ‘ package.json νμΌμ μ€μ λ λνλμλ€μ λͺ¨λ μ€μΉν©λλ€.
Default: false -
--inlineTemplate=true
μ»΄ν¬λνΈμ HTML νμΌμ λ³λλ‘ λ§λ€μ§ μκ³ class νμΌμμ μμ ν μ μλλ‘ μ‘°μΉν©λλ€.
Default: false -
--inlineStyle=true
μ»΄ν¬λνΈμ CSS νμΌμ λ³λλ‘ λ§λ€μ§ μκ³ class νμΌμμ μμ ν μ μλλ‘ μ‘°μΉν©λλ€. κ΄λ ¨νμ¬ μ€μ λ λ΄μ©μangular.jsonνμΌμμ μ°Ύμ μ μμ΅λλ€.
Default: false
angular.json
"schematics": {
"@schematics/angular:component": {
"inlineTemplate": true,
"inlineStyle": true,
"styleext": "scss"
}
},app.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
template: `
<!--The content below is only a placeholder and can be replaced.-->
<div style="text-align:center">
<h1>
Welcome to {{title}}!
</h1>
<!-- μλ΅ -->
<router-outlet></router-outlet>
`,
styles: []
})
export class AppComponent {
title = 'small-project';
}--skipGit=true
When true, does not initialize a git repository.
κΈ°λ³Έ κ°μ΄ falseλΌκ³ 곡μ μ¬μ΄νΈμ λμ μμΌλ μ΅μ μ μ¬μ©νμ§ μμλ κΉ μ μ₯μλ μμ±λμ§ μμ΅λλ€. κΈ°λ³Έ κ°μ trueλΌκ³ 보λ κ²μ΄ μ³κ² μ΅λλ€.
νλμ μν¬ μ€νμ΄μ€ ν΄λμ μ¬λ¬ μ΅κ·€λ¬ νλ‘μ νΈλ₯Ό μμ ν λλ κ°λ³ μ μΌλ‘ κΉ μ μ₯μλ₯Ό λ§λ€κΈ° 보λ€λ μν¬ μ€νμ΄μ€ λ¨μλ‘ λ§λλ κ²μ μ νΈν μ μκΈ° λλ¬Έμ νμν μ΅μ μ΄λΌ ν μ μμ΅λλ€.
μ΄κ² μ κ² λΊ νλ‘μ νΈλ₯Ό λ€μ λͺ
λ ΉμΌλ‘ λ§λ€μ΄ λ΄
μλ€. νλ‘μ νΈμ ꡬμ±κ³Ό package.json νμΌκ³Ό angular.json νμΌμ μ€μ λΆλΆμ μ΄ν΄λ³΄μΈμ.
$ ng new small-project --inlineTemplate=true --inlineStyle=true --minimal=true --skipTests=true --skipGit=true --skipInstall=true
νλ‘μ νΈ λ£¨νΈ ν΄λμμ λͺ
λ Ήμ μ€ννλ©΄ μ΅κ·€λ¬ νλ‘μ νΈλ₯Ό λΉλ λ° λ²λ€λ§ μμ
μ μ§ννκ³ μΉν© ν
μ€νΈ μλ²λ₯Ό κΈ°λν©λλ€. λλΆμ΄μ -o μ΅μ
μ μΆκ°νλ©΄ λΈλΌμ°μ κ° μ€νλκ³ μΉν© ν
μ€νΈ μλ²μ μ μνμ¬ index.html νμΌμ λ€μ΄λ°μμ νλ©΄μ νμν©λλ€.
μ μ»΄ν¬λνΈλ₯Ό μμ±ν©λλ€. μ»΄ν¬λνΈ μ μ©ν΄λκ° μμ±λ©λλ€. g λ¬Έμλ generate λ¬Έμμ΄μ μ€μ¬μ μ΄ κ²μ΄κ³ c λ¬Έμλ component λ¬Έμμ΄μ μ€μ¬μ μ΄ κ²μ λλ€.
-
--dryRun=true
When true, runs through and reports activity without writing out results.
κ²°κ³Όκ° μμλμ§ μμ λ, μ€μ λ‘ μννλ λμ μνκ³νλ§μ νμΈν μ μμ΅λλ€. -
--module=app
μ»΄ν¬λνΈλ₯Ό λ±λ‘ν λμ λͺ¨λμ μ§μ ν©λλ€.appλ¬Έμμ΄μAppModuleν΄λμ€μμModuleλ¨μ΄λ₯Ό λΊ ν μλ¬Έμλ‘ μ¬μ©ν©λλ€.- μλ΅νλ©΄ λ£¨νΈ λͺ¨λμ λ±λ‘λ©λλ€.
- μ»΄ν¬λνΈ μμ± μ νΉμ ν΄λ λ°μ λ§λ€λΌκ³ ν κ²½μ°, ν΄λΉ ν΄λμ λͺ¨λ νμΌμ΄ μ‘΄μ¬νλ€κ³ ν λ, μλ΅νλ©΄ ν΄λΉ ν΄λμ μ‘΄μ¬νλ λͺ¨λμ λ±λ‘λ©λλ€.
-
--selector=selector
μ»΄ν¬λνΈμ selector κ°μ μ§μ ν©λλ€. μλ΅νλ©΄ μ»΄ν¬λνΈλͺ μ μλμΌλ‘ μ§μ λ©λλ€. -
--prefix=my
μ»΄ν¬λνΈμ selector κ°μμ μ¬μ©ν λλ¬Έμλ₯Ό μ§μ ν©λλ€. μλ΅νλ©΄angular.jsonνμΌμ μ€μ μ λ°λ¦ λλ€. -
--inlineTemplate=true
HTML νμΌμ λ³λλ‘ λ§λ€μ§ μμ΅λλ€. μλ΅νλ©΄ λ³λλ‘ HTML νμΌμ μμ±ν©λλ€. -
--inlineStyle=true
CSS νμΌμ λ³λλ‘ λ§λ€μ§ μμ΅λλ€. μλ΅νλ©΄ λ³λλ‘ CSS νμΌμ μμ±ν©λλ€. -
--spec=false
ν μ€νΈ νμΌ(~.spec.ts)μ λ³λλ‘ λ§λ€μ§ μμ΅λλ€. μλ΅νλ©΄ λ³λλ‘ ν μ€νΈ νμΌμ μμ±ν©λλ€. -
--flat=true
μ»΄ν¬λνΈλ₯Ό μν μ μ© ν΄λλ₯Ό λ³λλ‘ λ§λ€μ§ μμ΅λλ€. μλ΅νλ©΄ λ³λλ‘ μ»΄ν¬λνΈλ₯Ό μν μ μ© ν΄λλ₯Ό μμ±ν©λλ€. -
λ³΄λ€ μμΈν λ΄μ©μ 곡μ μ¬μ΄νΈλ₯Ό μ°Έκ³ νμΈμ.
https://angular.io/cli/generate#component
μ μλΉμ€λ₯Ό μμ±ν©λλ€. s λ¬Έμλ service λ¬Έμμ΄μ μ€μ¬μ μ΄ κ²μ
λλ€.
https://angular.io/cli/generate#directive
μ κ°λλ₯Ό μμ±ν©λλ€. κ°λ€λ μλΉμ€μ μΌμ’
μΌλ‘ λΌμ°ν
μ²λ¦¬ μ μλνλ μλΉμ€μ
λλ€. λ λ²μ§Έ g λ¬Έμλ guard λ¬Έμμ΄μ μ€μ¬μ μ΄ κ²μ
λλ€.
https://angular.io/cli/generate#guard
μ νμ΄νλ₯Ό μμ±ν©λλ€. p λ¬Έμλ pipe λ¬Έμμ΄μ μ€μ¬μ μ΄ κ²μ
λλ€.
https://angular.io/cli/generate#pipe
--export=true--module=module--spec=false
μ λλ ν°λΈλ₯Ό μμ±ν©λλ€. d λ¬Έμλ directive λ¬Έμμ΄μ μ€μ¬μ μ΄ κ²μ
λλ€.
https://angular.io/cli/generate#directive
--export=true--module=module--spec=false
μ ν΄λμ€λ₯Ό μμ±ν©λλ€. c λ¬Έμλ component λ¬Έμμ΄μ μλ―ΈνκΈ° λλ¬Έμ μ¬μ©ν μ μμ΅λλ€. μ΄λ΄ λλ μ€μ¬ μ°μ§ λ§κ³ κ·Έλλ‘ class λΌλ λ¬Έμμ΄μ μ¬μ©νλ©΄ λ©λλ€.
https://angular.io/cli/generate#class
μ μΈν°νμ΄μ€λ₯Ό μμ±ν©λλ€. i λ¬Έμλ interface λ¬Έμμ΄μ μ€μ¬μ μ΄ κ²μ
λλ€.
https://angular.io/cli/generate#interface
μ λͺ¨λμ μμ±ν©λλ€. λͺ¨λ μ μ©ν΄λκ° μμ±λ©λλ€. m λ¬Έμλ module λ¬Έμμ΄μ μ€μ¬μ μ΄ κ²μ λλ€.
-
--routing=trueλΌμ°ν μ 보λ₯Ό λ³λμ νμΌλ‘ μ·¨κΈν μ μλλ‘ λΌμ°ν λͺ¨λ νμΌμ μΆκ°λ‘ μμ±ν©λλ€. μλ΅νλ©΄ μμ±λμ§ μκ³ λͺ¨λνμΌλ§ μμ±λ©λλ€. -
--module=app
μ λͺ¨λμ λ£¨νΈ λͺ¨λμ λ±λ‘νλ μμ μ μΆκ°λ‘ μνν©λλ€. -
λ³΄λ€ μμΈν λ΄μ©μ 곡μ μ¬μ΄νΈλ₯Ό μ°Έκ³ νμΈμ.
https://angular.io/cli/generate#module
κΈ°ν μμΈν μ¬μ©λ²μ 곡μ μ¬μ΄νΈλ₯Ό μ°Έκ³ νμΈμ.
https://angular.io/clihttps://cli.angular.io/
μ€μ΅μ ν΅ν΄μ μ΅κ·€λ¬ CLI μ¬μ©λ²μ νμ΅ν©λλ€. μ λΉν ν΄λλ₯Ό μμ
곡κ°(μν¬ μ€νμ΄μ€)μΌλ‘ κ°μ£Όνκ³ μ½μμμ 컀μλ₯Ό μ΄λ μν΅λλ€. $ κΈ°νΈλ ν둬ννΈλ₯Ό μλ―Έν©λλ€. $ κΈ°νΈ λ€μ λͺ
λ Ήμ λ°λΌνμΈμ.
$ ng new my-angular1
? Would you like to add Angular routing? No
? Which stylesheet format would you like to use? CSS$ cd my-angular1
$ ng serve -o
** Angular Live Development Server is listening on localhost:4200,
open your browser on http://localhost:4200/ **
Date: 2018-12-05T02:47:04.201Z
Hash: dc84e834c1cad91bd980
Time: 9772ms
chunk {main} main.js, main.js.map (main) 9.82 kB [initial] [rendered]
chunk {polyfills} polyfills.js, polyfills.js.map (polyfills) 223 kB [initial] [rendered]
chunk {runtime} runtime.js, runtime.js.map (runtime) 6.08 kB [entry] [rendered]
chunk {styles} styles.js, styles.js.map (styles) 16.3 kB [initial] [rendered]
chunk {vendor} vendor.js, vendor.js.map (vendor) 3.43 MB [initial] [rendered]
i ο½’wdmο½£: Compiled successfully.λ‘κ·Έλ₯Ό μ΄ν΄λ³΄λ©΄ http://localhost:4200/ μ£Όμλ‘ μΉ μλΉμ€κ° μμλ κ²μ μ μ μμ΅λλ€. ng serve -o λͺ
λ Ήμμ --open μ΅μ
μ μ£ΌμκΈ° λλ¬Έμ λ°λ‘ λΈλΌμ°μ κ° λ¨κ³ λ€μκ³Ό κ°μ νλ©΄μ λ³Ό μ μμ΅λλ€.
λΈλΌμ°μ μμ μμ€λ³΄κΈ°λ₯Ό ν©λλ€. μμ€μ λ΄μ©μ λ€μκ³Ό κ°μ΅λλ€.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>MyAngular1</title>
<base href="/">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
<app-root></app-root>
<script type="text/javascript" src="runtime.js"></script>
<script type="text/javascript" src="polyfills.js"></script>
<script type="text/javascript" src="styles.js"></script>
<script type="text/javascript" src="vendor.js"></script>
<script type="text/javascript" src="main.js"></script></body>
</html>ng serve -o λͺ
λ Ή μ μΆλ ₯λ λ‘κ·Έλ₯Ό μ΄ν΄ 보면 μΉ μλ²λ₯Ό μμνκΈ° μ μ 5κ°μ νμΌλ€λ‘ λ²λ€λ§ μμ
μ΄ μ§νλμμμ μ μ μμ΅λλ€. νλ‘μ νΈ λ£¨νΈμμ src ν΄λ λ°μ μ‘΄μ¬νλ index.html νμΌμ μλ°μ€ν¬λ¦½νΈ νμΌμ μν¬νΈνλ μ½λκ° μμ§λ§ λμ μΌλ‘ λΉλνλ κ³Όμ μμ index.html νμΌμ μΆκ°κ° λλ€κ³ μ΄ν΄νμλ©΄ λκ² μ΅λλ€.
runtime.js: μΉ ν© μλ²κ΄λ ¨ λ‘μ§polyfills.js: ν΄λ¦¬ν λΌμ΄λΈλ¬λ¦¬styles.js: CSS μ²λ¦¬ κ΄λ ¨ λ‘μ§vendor.js: μ΅κ·€λ¬ κΈ°μmain.js: κ°λ°μκ° μΆκ°ν λ‘μ§
κ°λ° μ€ μΉν©μ ν μ€νΈ μΉμλ²λ‘ μ¬μ©νλλ° μ μ²λ¦¬λ κ°λ° μ€ λΉλμ ν΄λΉν©λλ€. κ°λ° μ€ λΉλ, λ°°ν¬ ν μ€νΈ λΉλ, μ€ μλΉμ€ λΉλλ μ²λ¦¬κ²°κ³Όκ° μ‘°κΈ μ© λ€λ¦ λλ€. μ΄λ λ€μμ μμΈν μ΄ν΄λ³΄κ² μ΅λλ€.
-
index.htmlνμΌμ΄ λΈλΌμ°μ μκ² μ λ¬λ©λλ€.index.htmlνμΌμ μ΅κ·€λ¬ μ½λλ₯Ό λΈλΌμ°μ μκ² μ λ¬νλ μ©λλ‘ μ¬μ©λ©λλ€. -
main.tsνμΌμ΄ μ΅κ·€λ¬ μ½λμ μ§μ μ μ λλ€. μ΄ μ€μ μangular.jsonνμΌ λ΄"main": "src/main.ts"μ€μ μ λ°λΌ μ΄λ£¨μ΄μ§λλ€. μ΄ νμΌμ μ½λλ‘ μ μμ μΈ νκ²½μ€μ μ νκΈ°μν μ©λμ νμΌμ λλ€. -
app.module.tsνμΌμ΄ λ£¨νΈ λͺ¨λ(μμ λͺ¨λ)μ λλ€. μ΄λmain.tsνμΌ λ΄platformBrowserDynamic().bootstrapModule(AppModule)μ½λμ λ°λΌ μ΄λ£¨μ΄μ§λλ€. μ΅κ·€λ¬ νλ‘κ·Έλ¨μμ 루νΈλͺ¨λμ νλλ§ μ§μ ν μ μμ΅λλ€. -
app.component.tsνμΌμ΄ μμ μ»΄ν¬λνΈμ λλ€. μ΄λapp.module.tsνμΌ λ΄bootstrap: [AppComponent]μ€μ μ λ°λΌ μ΄λ£¨μ΄μ§λλ€. κΈ°λ μ»΄ν¬λνΈλ λ£¨νΈ λͺ¨λμ λ±λ‘λ μ»΄ν¬λνΈ μ€μ νλλ₯Ό μ νν΄μ λ±λ‘ν©λλ€. λ£¨νΈ λͺ¨λμκ² μν¬νΈ λ λͺ¨λμ΄ μμ ν μ»΄ν¬λνΈλ₯Ό λͺ μμ μΌλ‘ μ΅μ€ν¬νΈνλ€λ©΄ μμ μ»΄ν¬λνΈλ‘ μ¬μ©ν μ μμΌλ μΌλ°μ μΌλ‘ μ΄λ κ² μ¬μ©νμ§λ μμ΅λλ€. -
app.component.htmlνμΌμ΄ 첫 νλ©΄μ ꡬμ±νλ HTML νμΌμ λλ€. μ΄λapp.component.tsνμΌ λ΄templateUrl: './app.component.html'μ€μ μ λ°λΌ μ΄λ£¨μ΄μ§λλ€.app.component.tsνμΌ λ΄styleUrls: ['./app.component.css']μ€μ μ λ°λΌ HTML νμΌμ λμμΈμ΄ μ μ©λ©λλ€. -
AppComponentμ²λ¦¬κ° μλ£λλ©΄index.htmlνμΌ λ΄<app-root></app-root>νκ·Έ μ¬μ΄μ μ²λ¦¬λ λ΄μ©μ μΆκ°ν©λλ€. λ°λΌμ, μ΅κ·€λ¬λ 컀μ€ν νκ·Έ μ¬μ© μ λ§κ° νκ·Έκ° νμ μ‘΄μ¬ν΄μΌλ§ νλ©΄ μ€μ¬μ μ¬μ©ν μ μμ΅λλ€.app-rooλ¬Έμμ΄μapp.component.tsνμΌμμ μ μνselector: 'app-root'λ΄μ©κ³Ό μΌμΉν΄μΌ ν©λλ€.
κ°λ°μ€μ΄λΌλ©΄ environment.ts νμΌμ΄ μ¬μ©λ©λλ€. λΉλμμ --prod μ΅μ μ μ€μ νλ©΄ environment.prod.ts νμΌμ΄ μ¬μ©λ©λλ€. κ°λ°λͺ¨λμμ μ¬μ©νλ μ€μ μ 보λ environment.ts νμΌμ ν©λλ€. μλΉμ€λͺ¨λ(λ°°ν¬λͺ¨λ)μμ μ¬μ©νλ μ€μ μ 보λ environment.prod.ts νμΌμ νλ©΄ λ©λλ€.
λ€μ μ¬μ©μλ₯Ό μ΄ν΄λ³΄μΈμ. import μ½λλ λ³κ²½λ νμκ° μμ΅λλ€.
import { environment } from '../environments/environment';
const MODE = environment.production ? 'prod' : 'dev';environment νμΌμ μν¬νΈνλ λμ isDevMode() ν¨μλ₯Ό μ΄μ©ν μλ μμ΅λλ€.
import { Component, OnInit, isDevMode } from '@angular/core';
@Component({ ... })
export class AppComponent implements OnInit {
ngOnInit() {
if (isDevMode()) {
console.log('Development');
} else {
console.log('Production');
}
}
}μ°Έκ³ : https://alligator.io/angular/environment-variables/
λ Έλκ° μ μνλ νλ‘μ νΈ μ 보 λ° λνλμ μ€μ νμΌμ λλ€.
{
"name": "my-angular1",
"version": "0.0.0",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
},
"private": true,
"dependencies": {
"@angular/animations": "~7.1.0",
"@angular/common": "~7.1.0",
"@angular/compiler": "~7.1.0",
"@angular/core": "~7.1.0",
"@angular/forms": "~7.1.0",
"@angular/platform-browser": "~7.1.0",
"@angular/platform-browser-dynamic": "~7.1.0",
"@angular/router": "~7.1.0",
"core-js": "^2.5.4",
"rxjs": "~6.3.3",
"tslib": "^1.9.0",
"zone.js": "~0.8.26"
},
"devDependencies": {
"@angular-devkit/build-angular": "~0.11.0",
"@angular/cli": "~7.1.1",
"@angular/compiler-cli": "~7.1.0",
"@angular/language-service": "~7.1.0",
"@types/node": "~8.9.4",
"@types/jasmine": "~2.8.8",
"@types/jasminewd2": "~2.0.3",
"codelyzer": "~4.5.0",
"jasmine-core": "~2.99.1",
"jasmine-spec-reporter": "~4.2.1",
"karma": "~3.1.1",
"karma-chrome-launcher": "~2.2.0",
"karma-coverage-istanbul-reporter": "~2.0.1",
"karma-jasmine": "~1.1.2",
"karma-jasmine-html-reporter": "^0.2.2",
"protractor": "~5.4.0",
"ts-node": "~7.0.0",
"tslint": "~5.11.0",
"typescript": "~3.1.6"
}
}scriptsνλͺ©μλ μ΅κ·€λ¬ CLI λͺ λ Ήμ λ³μΉμ λ±λ‘ν©λλ€. μμ£Ό μ°λ λͺ λ Ήμ΄λ μ΅μ μ΄ λ§μ λͺ λ Ήλ€μ λ±λ‘ν΄ λκ³ μ¬μ©νλ©΄ νΈλ¦¬ν©λλ€.dependenciesνλͺ©μλ κ°λ° λ° μλΉμ€ μ€μ νμν λνλμλ€μ λ±λ‘ν©λλ€.devDependenciesνλͺ©μλ κ°λ° μ€μλ§ νμν λνλμλ€μ λ±λ‘ν©λλ€.- νμν λλΆλΆμ μ΅κ·€λ¬ λνλμλ μ€μ μ΄ λμ΄ μμΌλ
@angular/httpλ λΉ μ Έ μμ΅λλ€.@angular/httpλͺ¨λμ λ체 κΈ°μ λ‘μ¨ μΈκΈ° μλaxiosκ°μ κΈ°μ μ μ¬μ©νλΌλ λ°°λ €μΈ κ² κ°μ΅λλ€. core-jsλ ν΄λ¦¬ν λΌμ΄λΈλ¬λ¦¬μ λλ€.rxjsλ MSκ° λ§λ λΉλκΈ° μ²λ¦¬ κΈ°μ μ λλ€.tslibλ νμ μ€ν¬λ¦½νΈ λ°νμ λΌμ΄λΈλ¬λ¦¬μ λλ€.zone.jsλ ꡬκΈμ΄ λ§λ λ³κ²½κ°μ§ κΈ°μ μ λλ€.jasmineλ μΈκΈ°μλ μλ°μ€ν¬λ¦½νΈ ν μ€νΈ νλ μμν¬μ λλ€.karmaλ ν μ€νΈ λ°λμ λλ€.protractorλ ν΅ν© ν μ€νΈ κΈ°μ μ λλ€.@types/jasmineνμ΄ν μ μλ₯Ό μΆκ°λ‘ μ€μΉνλ©΄ IDE ν΄ μ¬μ© μ μμ€λ―Όκ³Ό κ΄λ ¨ν λμλ§ μλΉμ€λ₯Ό λ°μ μ μμ΅λλ€.
μ΅κ·€λ¬ λ²μ μ λ°λΌ angular.json νμΌμ λ΄μ©μ΄ λ³νκ° μμΌλ μ°Έκ³ νμκΈ° λ°λλλ€. μ¬κΈ° μ 체 λ΄μ©μ κΈ°λ‘νλ μ΄μ λ λ―Έλμ λ³κ²½λ μλ μκΈ° λλ¬Έμ
λλ€.
{
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"version": 1,
"newProjectRoot": "projects",
"projects": {
"my-angular1": {
"root": "",
"sourceRoot": "src",
"projectType": "application",
"prefix": "app",
"schematics": {},
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "dist/my-angular1",
"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,
"budgets": [{
"type": "initial",
"maximumWarning": "2mb",
"maximumError": "5mb"
}]
}
}
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "my-angular1:build"
},
"configurations": {
"production": {
"browserTarget": "my-angular1:build:production"
}
}
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"options": {
"browserTarget": "my-angular1:build"
}
},
"test": {
"builder": "@angular-devkit/build-angular:karma",
"options": {
"main": "src/test.ts",
"polyfills": "src/polyfills.ts",
"tsConfig": "src/tsconfig.spec.json",
"karmaConfig": "src/karma.conf.js",
"styles": [
"src/styles.css"
],
"scripts": [],
"assets": [
"src/favicon.ico",
"src/assets"
]
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": [
"src/tsconfig.app.json",
"src/tsconfig.spec.json"
],
"exclude": [
"**/node_modules/**"
]
}
}
}
},
"my-angular1-e2e": {
"root": "e2e/",
"projectType": "application",
"prefix": "",
"architect": {
"e2e": {
"builder": "@angular-devkit/build-angular:protractor",
"options": {
"protractorConfig": "e2e/protractor.conf.js",
"devServerTarget": "my-angular1:serve"
},
"configurations": {
"production": {
"devServerTarget": "my-angular1:serve:production"
}
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": "e2e/tsconfig.e2e.json",
"exclude": [
"**/node_modules/**"
]
}
}
}
}
},
"defaultProject": "my-angular1"
}"prefix": "app"μ»΄ν¬λνΈλ₯Ό μμ±ν λ μ»΄ν¬λνΈλ₯Ό κ°λ¦¬ν€λ 컀μ€ν νκ·Έλͺ μ μ§μ ν©λλ€. μ΄λ₯Ό selectorλΌκ³ λΆλ₯΄λλ° prefixλ μ λ ν° λ¬Έμμ΄ μμ μλμΌλ‘ λΆλ λλ¬Έμλ₯Ό κ°λ¦¬ν΅λλ€. μλ₯Ό λ€μ΄μ, μλμΌλ‘ λ§λ€μ΄μ§app.component.tsνμΌμ 보면selector: 'app-root'λΌκ³ νλ μ€μ μ΄ λ³΄μ΄μ€ κ²λλ€. νμν λ λ°κΎΈμ΄μ μ¬μ©νλ©΄ λ©λλ€."outputPath": "dist/my-angular1"λΉλκ²°κ³Ό νμΌμ΄ μ μ₯λλ μμΉμ λλ€."index": "src/index.html"μ μ€μ μ λ°λΌ index.html νμΌμ΄ μ΅κ·€λ¬ μ½λλ₯Ό μν¬νΈν΄μ λΈλΌμ°μ μκ² μ λ¬νλ μν μ μνν©λλ€."main": "src/main.ts"μ μ€μ μ λ°λΌ main.ts νμΌμ΄ κ°λ°μ λ‘μ§μ μμμ μ΄ λ©λλ€."polyfills": "src/polyfills.ts"ν΄λ¦¬ν κ΄λ ¨ μ€μ νμΌμ λλ€. IE λΈλΌμ°μ μμλ μ΅κ·€λ¬ μ λλ‘ μλνκΈ°λ₯Ό μνλ€λ©΄polyfills.tsνμΌμμ νμν λΆλΆμ μ£Όμμ²λ¦¬λ₯Ό ν΄μ νλ©΄ λ©λλ€."assets": ["src/favicon.ico","src/assets"]μ μ 리μμ€λ₯Ό λ±λ‘νλ μμΉμ κ΄λ ¨ν μ€μ μ λλ€. λ°λΌμ, μ΄λ―Έμ§ νμΌμassetsν΄λ λ°μ λ°°μΉνλ©΄ λ©λλ€."styles": ["src/styles.css"]index.htmlνμΌμ<head>νκ·Έ μ¬μ΄μ CSS μ€μ μ ν΄λ λμ§λ§styles.cssνμΌμ νλ©΄ λ³΄λ€ κΉλνκ²index.htmlνμΌμ κ΄λ¦¬ν μ μμ΅λλ€."scripts": []λΉλ μ ν¬ν¨λ μ μ μλ°μ€ν¬λ¦½νΈ νμΌμ λ±λ‘ν©λλ€.
κΈ°ν μμΈν λ΄μ©μ λ€μ μ¬μ΄νΈλ₯Ό μ°Έκ³ νμκΈ° λ°λλλ€.
https://github.com/angular/angular-cli/wiki/angular-clihttps://github.com/angular/angular-cli/wiki/angular-workspacehttps://nitayneeman.com/posts/understanding-the-angular-cli-workspace-file/
μ΄μ λΆν° μ»΄ν¬λνΈλ₯Ό μΆκ°ν΄λ³΄λ©΄μ νμ΅ν΄ 보λλ‘ νκ² μ΅λλ€. λ€μ λͺ
λ Ήμ νλ‘μ νΈ λ£¨νΈ λ°μμ μ€ννμΈμ. ng serve λͺ
λ Ήμ μννκ³ μλ μ½μμ°½μ κ·Έλλ‘ λμκ³ λ³λμ μ½μμ°½μ μ΄μ©ν©λλ€.
$ ng g c books --module=app
CREATE src/app/books/books.component.html (24 bytes)
CREATE src/app/books/books.component.spec.ts (621 bytes)
CREATE src/app/books/books.component.ts (265 bytes)
CREATE src/app/books/books.component.css (0 bytes)
UPDATE src/app/app.module.ts (392 bytes)booksλΌλ μ΄λ¦μΌλ‘ μ»΄ν¬λνΈλ₯Ό μμ±νλΌκ³ λͺ λ Ήνλ©΄ μ»΄ν¬λνΈμ κ΄λ ¨ν 4κ°μ νμΌμ΄ μμ±λ©λλ€.
src/appν΄λ λ°μΌλ‘ μ»΄ν¬λνΈλ₯Ό μν ν΄λbooksκ° μμ±λ©λλ€.books.component.htmlνμΌμ μ»΄ν¬λνΈ μ μ© HTML νμΌμ λλ€.books.component.spec.tsνμΌμ ν μ€νΈλ₯Ό μν νμΌμ λλ€. μμ€λ―Ό ν μ€νΈ νλ μμν¬ ν μ€νΈ μ½λλ₯Ό μμ±νλ μ©λμ λλ€.--spec=falseμ΅μ μ μΆκ°νλ©΄ μ΄ νμΌμ μμ±μ λ§μ μ μμ΅λλ€.books.component.tsνμΌμ μ»΄ν¬λνΈ μλ°μ€ν¬λ¦½νΈ ν΄λμ€ νμΌμ λλ€.books.component.cssνμΌμ μ»΄ν¬λνΈ μ μ© CSS νμΌμ λλ€.app.module.tsνμΌμ μλ‘ μμ±λ μ»΄ν¬λνΈκ° λ±λ‘λλ μ½λκ° μΆκ°λμ΄ UPDATE λμλ€κ³ νμλμμ΅λλ€.
$ ng g c books/book
CREATE src/app/books/book/book.component.html (23 bytes)
CREATE src/app/books/book/book.component.spec.ts (614 bytes)
CREATE src/app/books/book/book.component.ts (261 bytes)
CREATE src/app/books/book/book.component.css (0 bytes)
UPDATE src/app/app.module.ts (472 bytes)--module=appμ΅μ μ μλ΅νλ©΄ μ μ»΄ν¬λνΈλ λ£¨νΈ λͺ¨λμ λ±λ‘λ©λλ€.books/bookμ²λΌ μ¬μ©νλ©΄/μμ λ¬Έμμ΄μ ν΄λλ‘ μ·¨κΈλ©λλ€. ν΄λΉ ν΄λκ° μ‘΄μ¬νμ§ μμΌλ©΄ ν΄λκ° μλμΌλ‘ μμ±λκ³ μ΄λ―Έ μ‘΄μ¬νλ©΄ μμ±λμ§ μμ΅λλ€.bookμ΄λΌλ μ΄λ¦μ μ μ»΄ν¬λνΈλ books ν΄λ λ°μΌλ‘ μ μ© ν΄λbookμ λ§λ ν κ·Έ λ°μΌλ‘ μ»΄ν¬λνΈ κ΄λ ¨ νμΌμ μμ±ν©λλ€.
μ»΄ν¬λνΈκ° λ§λ€μ΄μ‘λ€κ³ λ°λ‘ νλ©΄μ νμλμ§λ μμ΅λλ€. μ΄λ»κ² νλ©΄μ λ°°μΉν μ μλμ§ μμ보λλ‘ νκ² μ΅λλ€.
κΈ°λ μ»΄ν¬λνΈμΈ AppComponentκ° μ¬μ©νλ app.component.html νμΌμ μ΄μ΄μ λ€μμ²λΌ λ³κ²½ν©λλ€.
<h1>I am app.component.html</h1>
<h2>{{title}}</h2>{{title}}λλΈ μ€κ΄νΈλ μΈν°ν΄λ μ΄μ ννμμΌλ‘ μμͺ½μ κ°λ¨ν μλ°μ€ν¬λ¦½νΈ μ½λλ₯Ό μμ±ν μ μμ΅λλ€.titleμ λ¬Έμμ΄ κΈ°νΈκ° μμΌλ―λ‘ λ³μλ₯Ό μλ―Έν©λλ€. μ»΄ν¬λνΈ ν΄λμ€κ° κ°κ³ μλ κ°μ΄ μΉνλμ΄ λ°°μΉλ©λλ€. μΈν°ν΄λ μ΄μ ννμμ νκ·Έλ λ¬Έμμ΄μ²λΌ μ·¨κΈν©λλ€.
λΈλΌμ°μ νλ©΄μ λ³νλ₯Ό νμΈνμΈμ.
ng serve λͺ
λ Ήμ μνν μ½μμ°½μ νμΈνμΈμ.
Date: 2018-12-05T07:05:25.266Z - Hash: 0d918a5704ebff4207f1 - Time: 3709ms
4 unchanged chunks
chunk {main} main.js, main.js.map (main) 13.8 kB [initial] [rendered]
i ο½’wdmο½£: Compiled successfully.μ΅κ·€λ¬λ νμΌμ΄ μ μ₯λ λ μλμΌλ‘ μ¬ λΉλμμ
μ μνν©λλ€. κ°λ°μκ° μμ±ν μ½λλ main.jsμ ν¬ν¨λλ―λ‘ ν΄λΉ νμΌλ§ μ¬ λ²λ€λ§ λμλ€λ κ²μ μ μ μμ΅λλ€. κ°λ° μ λ§€λ² ν
μ€νΈ μΉμλ²λ₯Ό μ¬ κΈ°λνμ§ μμλ λ°λ‘ μ μ©λκΈ° λλ¬Έμ λ§€μ° νΈλ¦¬ν©λλ€.
app.component.html νμΌμ λ€μμ²λΌ μμ ν©λλ€.
<h1>I am app.component.html</h1>
<h2>{{title}}</h2>
<app-books></app-books><app-books></app-books>app.component.html νμΌμμ books μ»΄ν¬λνΈμ selector λ¬Έμμ΄μ 컀μ€ν νκ·Έμ²λΌ μ¬μ©νλ©΄ νλ©΄μ books μ»΄ν¬λνΈκ° κ°μ§ HTML λ΄μ©μ΄ νμλ©λλ€. μ΅κ·€λ¬λ HTML5μμ λμ ν 컀μ€ν νκ·Έλ₯Ό κ·Έ 보λ€λ μμμ μ§μν λ©μ§ κΈ°μ μ λλ€.
컀μ€ν
νκ·Έμ λ₯λ ₯μ μ€λ‘ λ§κ°ν©λλ€. μ΄λ₯Ό λ껴보기 μν΄μ books.component.html νμΌμ λ€μμ²λΌ μμ ν©λλ€.
<h2>I am books.component.html</h2>
<p #target>Custom tag has a lot of potential!</p>
<button type="button" (click)="target.innerText='Can you feel it?'">Say</button>Sayλ²νΌμ ν΄λ¦νλ©΄pνκ·Έμμ λ¬Έμμ΄μ΄ λ³κ²½λ©λλ€.- λ°λ³΅μ μΌλ‘ μ¬μ©νλ HTML μ리먼νΈλ€μ μ»΄ν¬λνΈν ν ν κ°λ¨ν 컀μ€ν νκ·Έλ‘ μ΄λ₯Ό μνλ κ³³μ μ μ©ν μ μμ΅λλ€. μ리먼νΈλ€μ΄ 볡μ‘νλ©΄ ν μλ‘ μ΄λ λΉμ λ°ν©λλ€.
#target#λ³μμ€μ μΌλ‘ κ°λ¨ν μλ¦¬λ¨ΌνΈ μ°Έμ‘° κ°μ²΄λ₯Ό μμ±ν©λλ€.(click)="μλ°μ€ν¬λ¦½νΈ μ½λ"λ²νΌμ ν΄λ¦ μ΄λ²€νΈκ° λ°μνλ©΄ μ€λ₯Έμͺ½μ λ°°μΉλ μλ°μ€ν¬λ¦½νΈ μ½λκ° μ€νλ©λλ€.targetμ΄λΌλ μλ¦¬λ¨ΌνΈ μ°Έμ‘°λ₯Ό ν΅ν΄μpνκ·Έμ μ κ·Όνκ³target.innerTextμμ±μΌλ‘pνκ·Έ μμ λ¬Έμμ΄μ λ³κ²½ν©λλ€.
app.component.html νμΌμ λ€μμ²λΌ μμ ν©λλ€.
<h1>I am app.component.html</h1>
<h2>{{title}}</h2>
<hr>
<app-books></app-books>
<hr>
<app-books></app-books><app-books></app-books>컀μ€ν νκ·Έλ₯Ό λ λ² μ¬μ©νμ΅λλ€. 첫 λ²μ§ΈBooksComponentμ»΄ν¬λνΈμSayλ²νΌμ ν΄λ¦νμ΅λλ€. λ λ²μ§Έ μ»΄ν¬λνΈμ νλ©΄ λ΄μ©μ κ·Έλλ‘ μΈκ±Έ 보μμ£ . μ»΄ν¬λνΈλ νλ©΄μ λ°°μΉλ λ λ§€λ² μλ‘ λ§λ€μ΄ μ§λλ€. λ°λΌμ, μ΄κΈ° νλ©΄ λ΄μ©μ κ°μμ§λΌλ μ»΄ν¬λνΈ κ°μ²΄λ λ°λ‘ μ‘΄μ¬νλ κ²μ΄λ©° μ΄λ²€νΈμ μν΄μ νλ©΄λ΄μ©μ΄ λ°λμ΄λ λ€λ₯Έ μ»΄ν¬λνΈμ μν₯μ μ£Όμ§ μμ΅λλ€.
AppComponent μ»΄ν¬λνΈλ κΈ°λ μ»΄ν¬λνΈλ‘μ¨ μ 체νλ©΄μ λ΄λΉνλ μ»΄ν¬λνΈμ
λλ€. κ·Έλμ κΈ°λ μ»΄ν¬λνΈλ μμΈν νλ©΄λ΄μ©μ ꡬμ±νκΈ° 보λ€λ μ 체 νλ©΄μ ꡬ쑰λ§μ μ²λ¦¬νλ μν λ‘ μ¬μ©νλ κ²μ΄ μ’μ΅λλ€.
μ°λ¦¬λ μμμ AppComponent μ»΄ν¬λμ HTML νμΌμμ BooksComponent μ»΄ν¬λνΈμ selectorλ₯Ό 컀μ€ν
νκ·Έλ‘ μ¬μ©νμ¬ AppComponent μ»΄ν¬λνΈ νλ©΄μ μΌλΆλ₯Ό BooksComponent μ»΄ν¬λνΈλ‘ μ±μ μ΅λλ€. μ΄ κ²½μ°, AppComponent μ»΄ν¬λνΈλ λΆλͺ¨ μ»΄ν¬λνΈκ° λλ©΄ BooksComponent μ»΄ν¬λνΈλ μμ μ»΄ν¬λνΈλΌκ³ λΆλ¦
λλ€. μ΄λ¬ν κ΄κ³λ μ»΄ν¬λνΈ μμ± μ κ²°μ λλ κ²μ΄ μλλΌ μ¬μ© μ κ²°μ λ©λλ€.
BookComponent μ»΄ν¬λνΈ νμΌλ€μ μλμ μΌλ‘ books ν΄λ λ°μ λ§λ€μμ΅λλ€. μλνλ©΄ BookComponent μ»΄ν¬λνΈλ νμ BooksComponent μ»΄ν¬λνΈλ§ μμ μ»΄ν¬λνΈλ‘ μ¬μ©ν μμ μ΄κΈ° λλ¬Έμ
λλ€. κ·Έλ κΈ° λλ¬Έμ κ΄λ¦¬ λͺ©μ μ books ν΄λ λ°μ BookComponent μ»΄ν¬λνΈ νμΌλ€μ λ§λλ κ²μ΄ μ’μ΅λλ€.
μ΄μ BooksComponent μ»΄ν¬λνΈκ° BookComponent μ»΄ν¬λνΈλ₯Ό μμ μ»΄ν¬λνΈλ‘ μ¬μ©νλλ‘ ν΄λ³΄μ£ .
μ°μ books.component.ts νμΌμ μμ ν©λλ€.
import { Component, OnInit } from '@angular/core';
export class Book {
public id: number;
public title: string;
public author: string;
constructor(id: number, title: string, author: string) {
this.id = id;
this.title = title;
this.author = author;
}
}
@Component({
selector: 'app-books',
templateUrl: './books.component.html',
styleUrls: ['./books.component.css']
})
export class BooksComponent implements OnInit {
books: Array<Book> = [];
constructor() { }
ngOnInit() {
this.books.push(new Book(1, 'Google', 'Chris'));
this.books.push(new Book(2, 'Angular', 'John'));
this.books.push(new Book(3, 'Ionic', 'Iaan'));
}
}class Bookκ°μ²΄ λͺ¨λΈλ‘Bookν΄λμ€λ₯Ό μ¬μ©ν©λλ€. νμ μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νλ μ¦κ±°μμ ν¬κΈ°ν μ μμ΅λλ€.books: Array<Book>ν μ€νΈλ₯Ό μν λ°°μ΄μ λλ€.Bookμλ£νμ κ°μ²΄λ₯Ό μμλ‘ κ°μ΅λλ€.ngOnInit()μ»΄ν¬λνΈ λΌμ΄ν μ¬μ΄ν΄ λ©μλ μ€μ νλμ λλ€. implements OnInit ν λ€μ ꡬνν΄μ λ‘μ§μ λ°°μΉν©λλ€. κ°μ²΄κ° μμ±λ μ§ ν(μ¦, constructor() μ²λ¦¬κ° λ ν) κΈ°λν©λλ€.
books.component.html νμΌμ μμ ν©λλ€.
<div class="container">
<h2>I am books.component.html</h2>
<p #target>Custom tag has a lot of potential!</p>
<button type="button" (click)="target.innerText='Can you feel it?'">Say</button>
</div>
<br>
<div class="container-fluid">
<div class="row">
<div class="col-sm-6 mb-2" *ngFor="let b of books">
<app-book [book]="b"></app-book>
</div>
</div>
</div>-
class="container",class="container-fluid" -
class="row",class="col-sm-6"Bootstrap λμμΈμ μ μ©νκΈ° μν΄μ CSS ν΄λμ€λ€μ μΆκ°νμ΅λλ€. -
*ngFor="let b of books"ngForλ μ΅κ·€λ¬ μ 곡νλ λΉνΈμΈ λλ ν°λΈμ λλ€. λ°λ³΅ μ²λ¦¬ μ μ¬μ©ν©λλ€.booksλ°°μ΄μ κΈΈμ΄λ§νΌ μνλλ©° μμ λ³μbμ λ°°μ΄μ μμλ₯Ό ν λΉν©λλ€.ngForκ° μ€μ λdivμ리먼νΈκ° λ°λ³΅μ μΌλ‘ μμ±λ©λλ€. -
<app-book [book]="b"></app-book>λ³μbμ λ΄κΈ΄ κ°μ²΄λ₯Ό μμ μ»΄ν¬λνΈμΈapp-bookμκ²bookμ΄λΌλ ν€λ‘ μ λ¬ν©λλ€.[book]="b"μ€μ μ 컀μ€ν μμ±μ μ¬μ©νλ κ²μ΄λΌκ³ λ³Ό μ μμ΅λλ€. μ£Όμμ¬νμ΄ μλλ° μ΅κ·€λ¬λ 컀μ€ν μμ±μ μ¬μ©ν λ λΆλͺ¨ μ»΄ν¬λνΈμμλ§ μμ μ μνν μνλΌλ©΄ μλ¬κ° λ°μν©λλ€. μμ μ»΄ν¬λνΈμμ[book]="b"μ€μ μ λμνλ μμ μ΄ μ΄λ£¨μ΄μ ΈμΌλ§ μλ¬κ° λ°μνμ§ μμ΅λλ€. μ¦, λΆλͺ¨κ° μμμκ² λ°μ΄ν°λ₯Ό μ λ¬νλ €λ©΄ λΆλͺ¨ μ»΄ν¬λνΈμμ μ€λ€λ μ€μ μ ν΄μΌνκ³ μμ μ»΄ν¬λνΈμμ λ°λλ€λ μ€μ μ΄ λμμ μ΄λ£¨μ΄μ ΈμΌ νλ€λ μλ―Έμ λλ€.
book.component.ts νμΌμ μμ ν©λλ€.
import { Component, OnInit, Input } from '@angular/core';
import { Book } from '../books.component';
@Component({
selector: 'app-book',
templateUrl: './book.component.html',
styleUrls: ['./book.component.css']
})
export class BookComponent implements OnInit {
@Input('book') book: Book;
constructor() { }
ngOnInit() { }
}InputλλΆλΆμ λ°μ½λ μ΄ν°λ@angular/coreλͺ¨λμ μμ΅λλ€.@Input('book') bookλΆλͺ¨ μ»΄ν¬λνΈκ°bookμ΄λΌλ ν€λ‘ λ°μ΄ν°λ₯Ό μ λ¬ν λ κ·Έ ν€ κ°μ@Input('book')μ²λΌ μ€μ ν©λλ€. λ³μλͺ μ΄ ν€ κ°κ³Ό μΌμΉνλ€λ©΄ ν€ μ€μ μ μλ΅νμ¬@Input()μ²λΌ μ€μ ν μ μμ΅λλ€. λΆλͺ¨ μ»΄ν¬λνΈκ°bookμ΄λΌλ ν€λ‘ λ°μ΄ν°λ₯Ό μ£Όμ§μμλ μλ¬λ λ°μνμ§ μμ΅λλ€.
book.component.html νμΌμ μμ ν©λλ€.
<div class="card">
<div class="card-body">
<h4 class="card-title">
{{book.id + '. ' + book.title}} by {{book.author}}
</h4>
<p class="card-text">
Here are the top resources for all things related to the Sun.
</p>
<a href="#" class="card-link">Sun Gone</a>
<a href="#" class="card-link">Still Gone</a>
</div>
</div>class="card",class="card-body"λ±λ± Bootstrap 4 μΉ΄λ λμμΈμ μ μ©νκΈ° μν΄μ μ¬μ©ν©λλ€.{{book.id + '. ' + book.title}} by {{book.author}}μΈν°ν΄λ μ΄μ ννμμμμ κ°λ¨ν μλ°μ€ν¬λ¦½νΈ μ½λλ₯Ό μ¬μ©ν μ μμ΅λλ€. λμ΄μ°κΈ°λ₯Ό μ²λ¦¬νλ λ°©λ²μ μ°¨μ΄λ₯Ό μ΄ν΄λ³΄μΈμ.
index.html νμΌμ μμ ν©λλ€. μ΄λ Bootstrap 4 CSS λΌμ΄λΈλ¬λ¦¬λ₯Ό μν¬νΈ νκΈ° μν©μ
λλ€. λ€μ μ¬μ΄νΈλ₯Ό μ°Έκ³ νμ΅λλ€.
https://getbootstrap.com/docs/4.1/getting-started/introduction/
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>MyAngular1</title>
<base href="/">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico">
<link
rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"
integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO"
crossorigin="anonymous">
<style media="screen">
body {
margin-top: 20px;
margin-bottom: 20px;
}
</style>
</head>
<body>
<app-root></app-root>
</body>
</html>μμ κ²°κ³Όλ₯Ό λΈλΌμ°μ μμ νμΈν©λλ€.
νλ©΄μ΄ λ³΅μ‘ν΄ μ‘μ΅λλ€. νμ§λ§ app.component.html νμΌμ 보면 μ¬μ ν <app-books></app-books>λΌκ³ νλ μ€μ λ§μΌλ‘ 볡μ‘ν BooksComponentλ₯Ό μ¬μ©ν μ μμ΅λλ€.
μ»΄ν¬λνΈλ μ¬νμ©μ΄ κ°λ₯ν νλ©΄μ μ²λ¦¬λ¨μμ λλ€. μ»΄ν¬λνΈλ₯Ό μ΄λ μ λλ‘ λ³΅μ‘νκ² λ§λ€μ΄μΌ νλμ§μ λν κ°μ΄λλΌμΈμ μμ΅λλ€. μ€μν κ²μ μ¬ νμ©νκΈ° μ©μ΄νλλ μλλλ‘ νλ¨νλ κ²μ λλ€. μΌνλͺ°μ²λΌ 볡μ‘ν νλ©΄μ λͺκ°μ μ»΄ν¬λνΈλ‘ λλλ©΄ μ’μμ§ νμλ€κ³Ό λ Όμν΄ λ³΄μΈμ. κΆμ₯νκ³ μΆμ νλ¨κΈ°μ€μ μ΄λ μ΅λλ€. A νλ‘μ νΈ μνκ²°κ³Όλ‘μ¨ μ»μ λ€μμ μ»΄ν¬λνΈλ€μ΄ B νλ‘μ νΈμμ μ¬ μ¬μ©νκΈ°μ νΈλ¦¬ν΄μΌ ν©λλ€.
κ°λ°μ΄ λλλ©΄ λΉλκ³Όμ μ ν΅ν΄μ λ°°ν¬νμΌμ μμ±ν©λλ€. κ°λ° μ€μλ νμΌμ μν μ λ°λΌ λ‘μ§μ λ°λΌ λ€μμ νμΌλ‘ λλμ΄μ κ°λ°νλ κ²μ΄ νΈλ¦¬νμ§λ§ μ€ μ¬μ©μμκ² μλΉμ€ν λλ λ€μ΄λ‘λ μλλ₯Ό μΌλμ λμ΄ νλμ νμΌλ‘ λ¬Άμ΄μ μ 곡νλ κ²μ΄ μ 리ν©λλ€. μ΄λ¬ν μμ μ λ²λ€λ§μ΄λΌκ³ λΆλ¦ λλ€. μ΅κ·€λ¬λ μΉν©μ μ¬μ©νμ¬ λ²λ€λ§ μμ μ μνν©λλ€. μΆκ°λ‘ μλ°μ€ν¬λ¦½νΈ μ½λλ μμΆκ³Όμ μ ν΅ν΄ μ¬μ΄μ¦κ° κΈκ²©νκ² μ€μ΄λ€κ² λ©λλ€.
μ΅κ·€λ¬ CLI λκ΅¬κ° μ 곡λμ§ μμμ λλ κ±Έν, κ·Έλ°νΈ κ°μ κΈ°μ μ νμλ‘ μ¬μ©νμ΄μΌ νμ΅λλ€. κ·Έλ¬λ€κ° μΉν©μ΄λΌλ κ±ΈμΆν λκ΅¬κ° μΆννμ¬ κ·Έ μ§μλ₯Ό μ΄μ΄λ°μμ΅λλ€. κ·Έ νμ, μ΅κ·€λ¬ CLIκ° μλΉμ€λμλλ° μ΄ λꡬλ μΉν©μ μ² μ ν ν¬μ₯νμ¬ κ²μΌλ‘λ μΉν©μ μ‘΄μ¬μ 무λ μ μ μλ μ λμ
λλ€. node_modules ν΄λλ₯Ό 보μλ©΄ webpack κ΄λ ¨ κΈ°μ μ μ‘΄μ¬λ₯Ό νμΈν μ μμ΅λλ€.
μ΅κ·€λ¬κ° μ 곡νλ λΉλλ 2κ°μ§κ° μμ΅λλ€.
- λ°°ν¬ ν μ€νΈλ₯Ό μν λΉλ
- μ€ μλΉμ€λ₯Ό μν λΉλ
μΌλ°μ μΌλ‘ κ°λ°μ PCμμλ λ¨μν
μ€νΈλ₯Ό μ§νν©λλ€. κ°λ°μλ€μ κ°λ°λ΄μμ λͺ¨μμ ν
μ€νΈ μλ²μ μ¬λ¦¬κ³ ν΅ν©ν
μ€νΈλ₯Ό μνν©λλ€. μΆκ°λ‘ μ¬μ©μλ₯Ό λΆμνμ¬ νλ₯΄μλλ₯Ό μ€λ¦½νκ³ μ¬μ©μμ νλμ μμνμ¬ μ§ννλ ν
μ€νΈκ° μμ΅λλ€. μ΄ ν
μ€νΈλ₯Ό μν λΉλκ° λ°°ν¬ ν
μ€νΈλ₯Ό μν λΉλκ° λκ² μ΅λλ€. ν
μ€νΈ μ μ€μ λΈλΌμ°μ λ₯Ό μ΄μ©νλ€λ μ μ΄ λ¨μν
μ€νΈ, ν΅ν©ν
μ€νΈμ λ€λ₯Έ μ μ΄λΌ νκ² μ΅λλ€. λ¨μν
μ€νΈ, ν΅ν©ν
μ€νΈλ μ½λμ μΌλ‘ μ²λ¦¬νμ¬ μλμΌλ‘ μ²λ¦¬νκ³ μ¬μ©μμ λΉμν ν
μ€νΈλ μλμΌλ‘ μ§νν©λλ€.
λ€μ λͺ λ ΉμΌλ‘ λ°°ν¬ ν μ€νΈλ₯Ό μν λΉλλ₯Ό μνν©λλ€.
$ ng build
Date: 2018-12-07T03:27:52.735Z
Hash: 8c93d80bd782a0b7c788
Time: 9858ms
chunk {main} main.js, main.js.map (main) 14.3 kB [initial] [rendered]
chunk {polyfills} polyfills.js, polyfills.js.map (polyfills) 223 kB [initial] [rendered]
chunk {runtime} runtime.js, runtime.js.map (runtime) 6.08 kB [entry] [rendered]
chunk {styles} styles.js, styles.js.map (styles) 16.3 kB [initial] [rendered]
chunk {vendor} vendor.js, vendor.js.map (vendor) 3.11 MB [initial] [rendered]distν΄λκ° μμ±λκ³ λ°μΌλ‘ νλ‘μ νΈλͺ ν΄λκ° μμ±λ©λλ€.- map νμΌμ μΉ λΈλΌμ°μ ν
μ€νΈ μ λ°μνλ μλ¬μ μμΉλ₯Ό
.tsνμΌμ μμΉλ₯Ό μ°κ²°νκΈ° μν λ§€ν λͺ©μ μ νμΌμ λλ€. - ν μ€νΈ μ μ½λ μΆμ μ μν΄μ μλ°μ€ν¬λ¦½νΈ νμΌμ μμΆμ΄ λ μνκ° μλλλ€. λ°°ν¬ λΉλμμλ μμΆμ΄ μ μ©λμ΄ μ¬μ΄μ¦κ° ν¬κ² μ€μ΄λλλ€.
index.htmlνμΌμ νμΌκ²½λ‘λ‘ λΈλΌμ°μ μ μ΄λ©΄ ν¨μ€ λ¬Έμ λ‘ μλνμ§ μμ΅λλ€.
μΉ λΈλΌμ°μ μμ ν
μ€νΈνκΈ° μν΄μλ λΉλ κ²°κ³Όλ₯Ό μΉ μλ²κ° λ°°ν¬ μλΉμ€λ₯Ό ν΄μ£Όμ΄μΌ ν©λλ€. μ΄λ₯Ό μν΄μ κ°λ¨νκ² μ¬μ©ν μ μλ http-server κΈ°μ μ μκ°ν©λλ€.
http-serverλ₯Ό μ€μΉν©λλ€.
$ npm i -g http-server
$ http-server dist/my-angular1
Starting up http-server, serving dist/my-angular1
Available on:
http://192.168.0.54:8080
http://127.0.0.1:8080
Hit CTRL-C to stop the server
http://127.0.0.1:8080 μ£Όμλ‘ λΈλΌμ°μ λ₯Ό μ¬μ©νμ¬ μ μνκ³ ν
μ€νΈλ₯Ό μ§ννμΈμ.
ng build --prod
Date: 2018-12-07T04:21:35.631Z
Hash: bd09008c2b3627ecf9b4
Time: 15784ms
chunk {0} runtime.ec2944dd8b20ec099bf3.js (runtime) 1.41 kB [entry] [rendered]
chunk {1} main.07a238c657bdab0ce505.js (main) 179 kB [initial] [rendered]
chunk {2} polyfills.20ab2d163684112c2aba.js (polyfills) 37.5 kB [initial] [rendered]
chunk {3} styles.3ff695c00d717f2d2a11.css (styles) 0 bytes [initial] [rendered]- λ°°ν¬ λΉλ κ²°κ³Όλ‘ μκΈ΄ νμΌλ€μ ν¬κΈ°λ₯Ό μ΄ν΄λ΄
λλ€. μ΅κ·€λ¬ νλ μμν¬ μ½λμ κ°λ°μκ° μμ±ν μ½λλ
main.λμκ°.jsνμΌμ λ€μ΄ μμ΅λλ€. μ΄ νμΌμ μ¬μ΄μ¦λ 179KB μ λλ‘μ¨ μ΄λ λ§€μ° μλ€κ³ ν μ μμ΅λλ€.
- λλΌμ΄ μ μ νμΌμ ν¬κΈ°κ° Angular CLI λ²μ μ΄ μ¬λΌκ° μλ‘ μ μ μμμ§κ³ μλ€λ μ¬μ€μ λλ€. λΉμ·ν μ½λλ₯Ό Reactλ‘ μ§κ³ λΉλ νμ λ μ½ 150KB μ λμ ν¬κΈ°λ₯Ό κ°μ΅λλ€. μ΄μ ν¬κΈ°λ‘ μ΅κ·€λ¬λ₯Ό λΉλνλ Vue.js μΉνΈμλ€μ μκΈ°λ ν¬κ² μλΏμ§ μκ² λμμ΅λλ€.
- μ΅κ·€λ¬κ° μλνλ Tree Shaking μ²λ¦¬λ‘ κ°λ°μκ° μ€μ λ‘ μ¬μ©νλ λΌμ΄λΈλ¬λ¦¬ κΈ°λ₯λ§μ΄ ν¬ν¨λ©λλ€.
- μλ°μ€ν¬λ¦½νΈ νμΌμ μμΆμ΄ μ μ©λμ΄ νμΌμ μ΄μ΄λ³΄μλ©΄ μ½μ μ μλ μνλΌλ κ²μ μ μ μμ΅λλ€.
- λ°°ν¬ νμΌμ μΉ μλ²μ μ μ 리μμ€ μλΉμ€ ν΄λμ λ°°μΉν΄μ λΈλΌμ°μ μ μμ² μ HTML νμΌμ μ λ¬ν©λλ€. λΈλΌμ°μ κ° HTML νμΌμ μ²λ¦¬νλ λμ€μ μ΅κ·€λ¬μ μλ°μ€ν¬λ¦½νΈ μ½λκ° κΈ°λνμ¬ μλΉμ€κ° μμλ©λλ€.
- μλ°μ€ν¬λ¦½νΈ νμΌλͺ μ€μ μ¬μ©λ λμκ°μ νμΌ μ΄λ¦ μΆ©λμ μλ°©νλ μ°¨μμ μλΉμ€μ λλ€. λ°°ν¬ μ index.html νμΌλͺ μ λ³κ²½νμ¬ μ¬μ©ν μ μμ΅λλ€.
- μ μμλ μ¬λΆλ μμμ μ¬μ©ν΄ λ³Έ
http-serverλ₯Ό μ΄μ©νμΈμ.





