Cài đặt Visual Studio 2019 preview, .NET Core SDK 5
Tạo dự án mới
Lần chạy đầu tiên sẽ khá lâu, do cần tải về các thư viện. Kiên nhẫn chờ đợi khoảng 5 phút, chứ không phải Visual Studio 2019 preview bị treo. Trình duyệt web sẽ được tự động bật ra. Nếu có hộp thoại cảnh báo error, hãy cứ chấp nhận. Vì kết quả vẫn hiện ra:
Vài file Mã nguồn minh họa
File SKClientAppsrcappcountercounter.component.html
1 2 3 4 5 6 7 8 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>h1</span><span class="token punctuation">></span></span>Counter<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>h1</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span>This is a simple example of an Angular component.<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span> <span class="token attr-name">aria-live</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>polite<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Current count: <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>strong</span><span class="token punctuation">></span></span>{{ currentCount }}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>strong</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>button</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>btn btn-primary<span class="token punctuation">"</span></span> <span class="token attr-name">(click)</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>incrementCounter()<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Increment<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>button</span><span class="token punctuation">></span></span> |
File SKClientAppsrcappcountercounter.component.ts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <span class="token keyword">import</span> <span class="token punctuation">{</span> Component <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@angular/core'</span><span class="token punctuation">;</span> @<span class="token function">Component</span><span class="token punctuation">(</span><span class="token punctuation">{</span> selector<span class="token punctuation">:</span> <span class="token string">'app-counter-component'</span><span class="token punctuation">,</span> templateUrl<span class="token punctuation">:</span> <span class="token string">'./counter.component.html'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token keyword">export</span> <span class="token keyword">class</span> <span class="token class-name">CounterComponent</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> currentCount <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token function">incrementCounter</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>currentCount<span class="token operator">++</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
File SKClientAppsrcappfetch-datafetch-data.component.ts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <span class="token keyword">import</span> <span class="token punctuation">{</span> Component<span class="token punctuation">,</span> Inject <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@angular/core'</span><span class="token punctuation">;</span> <span class="token keyword">import</span> <span class="token punctuation">{</span> HttpClient <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@angular/common/http'</span><span class="token punctuation">;</span> @<span class="token function">Component</span><span class="token punctuation">(</span><span class="token punctuation">{</span> selector<span class="token punctuation">:</span> <span class="token string">'app-fetch-data'</span><span class="token punctuation">,</span> templateUrl<span class="token punctuation">:</span> <span class="token string">'./fetch-data.component.html'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token keyword">export</span> <span class="token keyword">class</span> <span class="token class-name">FetchDataComponent</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> forecasts<span class="token punctuation">:</span> WeatherForecast<span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">constructor</span><span class="token punctuation">(</span>http<span class="token punctuation">:</span> HttpClient<span class="token punctuation">,</span> @<span class="token function">Inject</span><span class="token punctuation">(</span><span class="token string">'BASE_URL'</span><span class="token punctuation">)</span> baseUrl<span class="token punctuation">:</span> <span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> http<span class="token punctuation">.</span><span class="token keyword">get</span><span class="token operator"><</span>WeatherForecast<span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token operator">></span><span class="token punctuation">(</span>baseUrl <span class="token operator">+</span> <span class="token string">'weatherforecast'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">subscribe</span><span class="token punctuation">(</span>result <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>forecasts <span class="token operator">=</span> result<span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> error <span class="token operator">=></span> <span class="token builtin">console</span><span class="token punctuation">.</span><span class="token function">error</span><span class="token punctuation">(</span>error<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">interface</span> <span class="token class-name">WeatherForecast</span> <span class="token punctuation">{</span> date<span class="token punctuation">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span> temperatureC<span class="token punctuation">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span> temperatureF<span class="token punctuation">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span> summary<span class="token punctuation">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Các file mã nguồn khác có thể xem trong project vừa được sinh ra.
Cập nhật lên phiên bản mới nhất SKClientApppackage.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | <span class="token punctuation">{</span> <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"sk"</span><span class="token punctuation">,</span> <span class="token property">"version"</span><span class="token operator">:</span> <span class="token string">"0.0.0"</span><span class="token punctuation">,</span> <span class="token property">"scripts"</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">"ng"</span><span class="token operator">:</span> <span class="token string">"ng"</span><span class="token punctuation">,</span> <span class="token property">"start"</span><span class="token operator">:</span> <span class="token string">"ng serve"</span><span class="token punctuation">,</span> <span class="token property">"build"</span><span class="token operator">:</span> <span class="token string">"ng build"</span><span class="token punctuation">,</span> <span class="token property">"build:ssr"</span><span class="token operator">:</span> <span class="token string">"ng run SK:server:dev"</span><span class="token punctuation">,</span> <span class="token property">"test"</span><span class="token operator">:</span> <span class="token string">"ng test"</span><span class="token punctuation">,</span> <span class="token property">"lint"</span><span class="token operator">:</span> <span class="token string">"ng lint"</span><span class="token punctuation">,</span> <span class="token property">"e2e"</span><span class="token operator">:</span> <span class="token string">"ng e2e"</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token property">"private"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token property">"dependencies"</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">"@angular/animations"</span><span class="token operator">:</span> <span class="token string">"9.1.11"</span><span class="token punctuation">,</span> <span class="token property">"@angular/common"</span><span class="token operator">:</span> <span class="token string">"9.1.11"</span><span class="token punctuation">,</span> <span class="token property">"@angular/compiler"</span><span class="token operator">:</span> <span class="token string">"9.1.11"</span><span class="token punctuation">,</span> <span class="token property">"@angular/core"</span><span class="token operator">:</span> <span class="token string">"9.1.11"</span><span class="token punctuation">,</span> <span class="token property">"@angular/forms"</span><span class="token operator">:</span> <span class="token string">"9.1.11"</span><span class="token punctuation">,</span> <span class="token property">"@angular/platform-browser"</span><span class="token operator">:</span> <span class="token string">"9.1.11"</span><span class="token punctuation">,</span> <span class="token property">"@angular/platform-browser-dynamic"</span><span class="token operator">:</span> <span class="token string">"9.1.11"</span><span class="token punctuation">,</span> <span class="token property">"@angular/platform-server"</span><span class="token operator">:</span> <span class="token string">"9.1.11"</span><span class="token punctuation">,</span> <span class="token property">"@angular/router"</span><span class="token operator">:</span> <span class="token string">"9.1.11"</span><span class="token punctuation">,</span> <span class="token property">"@nguniversal/module-map-ngfactory-loader"</span><span class="token operator">:</span> <span class="token string">"9.1.11"</span><span class="token punctuation">,</span> <span class="token property">"aspnet-prerendering"</span><span class="token operator">:</span> <span class="token string">"^3.0.1"</span><span class="token punctuation">,</span> <span class="token property">"bootstrap"</span><span class="token operator">:</span> <span class="token string">"4.5.0"</span><span class="token punctuation">,</span> <span class="token property">"core-js"</span><span class="token operator">:</span> <span class="token string">"3.6.5"</span><span class="token punctuation">,</span> <span class="token property">"jquery"</span><span class="token operator">:</span> <span class="token string">"3.5.1"</span><span class="token punctuation">,</span> <span class="token property">"oidc-client"</span><span class="token operator">:</span> <span class="token string">"1.10.1"</span><span class="token punctuation">,</span> <span class="token property">"popper.js"</span><span class="token operator">:</span> <span class="token string">"^1.16.0"</span><span class="token punctuation">,</span> <span class="token property">"rxjs"</span><span class="token operator">:</span> <span class="token string">"6.5.5"</span><span class="token punctuation">,</span> <span class="token property">"zone.js"</span><span class="token operator">:</span> <span class="token string">"0.10.3"</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token property">"devDependencies"</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">"@angular-devkit/build-angular"</span><span class="token operator">:</span> <span class="token string">"^0.901.9"</span><span class="token punctuation">,</span> <span class="token property">"@angular/cli"</span><span class="token operator">:</span> <span class="token string">"9.1.11"</span><span class="token punctuation">,</span> <span class="token property">"@angular/compiler-cli"</span><span class="token operator">:</span> <span class="token string">"9.1.11"</span><span class="token punctuation">,</span> <span class="token property">"@angular/language-service"</span><span class="token operator">:</span> <span class="token string">"9.1.11"</span><span class="token punctuation">,</span> <span class="token property">"@types/jasmine"</span><span class="token operator">:</span> <span class="token string">"~3.4.4"</span><span class="token punctuation">,</span> <span class="token property">"@types/jasminewd2"</span><span class="token operator">:</span> <span class="token string">"~2.0.8"</span><span class="token punctuation">,</span> <span class="token property">"@types/node"</span><span class="token operator">:</span> <span class="token string">"~12.11.6"</span><span class="token punctuation">,</span> <span class="token property">"codelyzer"</span><span class="token operator">:</span> <span class="token string">"^5.2.0"</span><span class="token punctuation">,</span> <span class="token property">"jasmine-core"</span><span class="token operator">:</span> <span class="token string">"~3.5.0"</span><span class="token punctuation">,</span> <span class="token property">"jasmine-spec-reporter"</span><span class="token operator">:</span> <span class="token string">"~4.2.1"</span><span class="token punctuation">,</span> <span class="token property">"karma"</span><span class="token operator">:</span> <span class="token string">"^5.0.2"</span><span class="token punctuation">,</span> <span class="token property">"karma-chrome-launcher"</span><span class="token operator">:</span> <span class="token string">"~3.1.0"</span><span class="token punctuation">,</span> <span class="token property">"karma-coverage-istanbul-reporter"</span><span class="token operator">:</span> <span class="token string">"~2.1.0"</span><span class="token punctuation">,</span> <span class="token property">"karma-jasmine"</span><span class="token operator">:</span> <span class="token string">"~2.0.1"</span><span class="token punctuation">,</span> <span class="token property">"karma-jasmine-html-reporter"</span><span class="token operator">:</span> <span class="token string">"^1.4.2"</span><span class="token punctuation">,</span> <span class="token property">"typescript"</span><span class="token operator">:</span> <span class="token string">"3.5.3"</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token property">"optionalDependencies"</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">"node-sass"</span><span class="token operator">:</span> <span class="token string">"^4.12.0"</span><span class="token punctuation">,</span> <span class="token property">"protractor"</span><span class="token operator">:</span> <span class="token string">"~5.4.2"</span><span class="token punctuation">,</span> <span class="token property">"ts-node"</span><span class="token operator">:</span> <span class="token string">"~8.4.1"</span><span class="token punctuation">,</span> <span class="token property">"tslint"</span><span class="token operator">:</span> <span class="token string">"~5.20.0"</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Clean project, sau đó build lại, để các thư viện có liên quan là mới nhất.