# π Π¨Π°Π±Π»ΠΎΠ½ ΠΏΡΠΎΠ΅ΠΊΡΠ° ASP NET CORE MVC, Frontend - Π½Π° TypeScript
## π ΠΡΠ°ΠΏΡ Π½Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠΌΠΈ π
---
1. β
ΠΠΌΠΏΠΎΡΡ `tsconfig.json` β
---
Π Π°ΡΠΊΡΡΡΡ ΠΊΠΎΠ΄ tsconfig.json
```json
{
"compilerOptions": {
"target": "es2016", // Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΡΠΎΠ²Π΅Π½Ρ JavaScript, Π² ΠΊΠΎΡΠΎΡΡΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ TypeScript (Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ES2016).
"module": "es6", // ΠΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ, ΠΊΠ°ΠΊΠΎΠΉ ΠΌΠΎΠ΄ΡΠ»ΡΠ½ΡΠΉ ΡΠΎΡΠΌΠ°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ (ES6 ΠΌΠΎΠ΄ΡΠ»ΠΈ).
"moduleResolution": "node", // Π‘ΠΏΠΎΡΠΎΠ± ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ. Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ Π² Node.js.
"jsx": "preserve", // ΠΠ°ΠΊ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ JSX. Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌ JSX Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.
"declaration": false, // Π£ΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π»ΠΈ ΡΠ°ΠΉΠ»Ρ ΡΠΈΠΏΠΎΠ² (.d.ts). ΠΠ΄Π΅ΡΡ ΡΡΠΎ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΎ.
"removeComments": true, // Π£ΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΡΠ΄Π°Π»Π΅Π½Ρ ΠΈΠ· ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°.
"noImplicitAny": false, // ΠΡΠΊΠ»ΡΡΠ°Π΅Ρ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ ΠΎ Π½Π΅ΡΠ²Π½ΡΡ
ΡΠΈΠΏΠ°Ρ
`any` Π² ΠΊΠΎΠ΄Π΅.
"noEmitOnError": true, // Π£ΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΠΎΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π°, Π΅ΡΠ»ΠΈ Π΅ΡΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ.
"sourceMap": true, // ΠΠ΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΠΊΠ°ΡΡΡ ΠΈΡΡ
ΠΎΠ΄Π½ΡΡ
ΠΊΠΎΠ΄ΠΎΠ² Π΄Π»Ρ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΡ ΠΎΡΠ»Π°Π΄ΠΊΠΈ.
"esModuleInterop": true, // ΠΠΊΠ»ΡΡΠ°Π΅Ρ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡ Ρ ΠΌΠΎΠ΄ΡΠ»ΡΠΌΠΈ ES ΠΏΡΠΈ ΠΈΠΌΠΏΠΎΡΡΠ΅ CommonJS ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ.
"experimentalDecorators": true, // ΠΠΊΠ»ΡΡΠ°Π΅Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΡΡ
Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡΠΎΠ² Π² TypeScript.
"emitDecoratorMetadata": true, // ΠΠΊΠ»ΡΡΠ°Π΅Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΡ
Π΄Π»Ρ Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π² ΡΠ°ΠΊΠΈΡ
Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°Ρ
ΠΊΠ°ΠΊ TypeORM ΠΈΠ»ΠΈ Angular.
"outDir": "ScriptsAndCss/JsScripts", // Π£ΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ Π΄Π»Ρ ΡΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ
ΡΠ°ΠΉΠ»ΠΎΠ².
"lib": [ "es2016", "dom" ] // Π£ΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ Π²ΠΊΠ»ΡΡΠ΅Π½Ρ ΠΏΡΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ (ES2016 ΠΈ DOM).
},
"exclude": [
"node_modules" // ΠΡΠΊΠ»ΡΡΠ°Π΅Ρ ΠΏΠ°ΠΏΠΊΡ node_modules ΠΈΠ· ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ.
]
}
```
---
2. β
ΠΠΌΠΏΠΎΡΡ `webpack.config.js` β
---
Π Π°ΡΠΊΡΡΡΡ ΠΊΠΎΠ΄ webpack.config.js
```js
const path = require('path');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
const TerserPlugin = require('terser-webpack-plugin'); // ΠΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌ TerserPlugin
module.exports = {
entry: {
app: './ScriptsAndCss/TypeScripts/main_api.ts', // Π’ΠΎΡΠΊΠ° Π²Ρ
ΠΎΠ΄Π° Π΄Π»Ρ JavaScript
styles: './ScriptsAndCss/CssFiles/styles.css' // Π’ΠΎΡΠΊΠ° Π²Ρ
ΠΎΠ΄Π° Π΄Π»Ρ CSS (ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π»ΡΠ±ΠΎΠΉ CSS-ΡΠ°ΠΉΠ»)
},
output: {
path: path.resolve(__dirname, 'wwwroot/js'),
filename: '[name].min.js' // ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ [name] Π΄Π»Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΡΠ°ΠΉΠ»Π°
},
resolve: {
extensions: ['.ts', '.js', '.css'] // ΠΠΎΠ±Π°Π²ΠΈΠ»ΠΈ .css
},
module: {
rules: [
{
test: /\.ts$/,
use: 'ts-loader',
exclude: /node_modules/
},
{
test: /\.css$/,
use: [
MiniCssExtractPlugin.loader, // ΠΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ CSS Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ
'css-loader' // ΠΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ @import ΠΈ url()
]
}
]
},
plugins: [
new MiniCssExtractPlugin({
filename: '../css/app.min.css' // ΠΡΠ΄Π° Webpack Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΡ CSS-ΡΠ°ΠΉΠ»
})
],
mode: 'development',
watch: true,
};
```
> Π ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ Π² Production ΡΠ΅Π»ΠΈΠ·Π° Π½ΡΠΆΠ½ΠΎ ΡΠΌΠ΅Π½ΠΈΡΡ ΡΠ΅ΠΆΠΈΠΌ `mode: 'development'` Π½Π° `mode: 'production'` Π² ΡΠ°ΠΉΠ»Π΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ
Π Π°ΡΠΊΡΡΡΡ ΠΊΠΎΠ΄ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ webpack.config.js
```js
mode: 'production', // ΠΠ·ΠΌΠ΅Π½Π΅Π½ ΡΠ΅ΠΆΠΈΠΌ Π½Π° production Π΄Π»Ρ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ
optimization: {
minimize: true, // ΠΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΡ
minimizer: [
new TerserPlugin(), // ΠΠ»Π°Π³ΠΈΠ½ Π΄Π»Ρ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ JS
new CssMinimizerPlugin() // ΠΠ»Π°Π³ΠΈΠ½ Π΄Π»Ρ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ CSS
]
},
```
---
3. β
ΠΠΌΠΏΠΎΡΡ `package.json` - ΡΡΠ΄ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² ΠΎΠΏΡΠΈΠΎΠ½Π°Π»Π΅Π½ ΠΏΠΎΠ΄ Π²Π°Ρ ΠΏΡΠΎΠ΅ΠΊΡ β
---
Π Π°ΡΠΊΡΡΡΡ ΠΊΠΎΠ΄ package.json
```json
{
"version": "1.0.0",
"name": "asp.net",
"private": true,
"devDependencies": {
"css-minimizer-webpack-plugin": "7.0.0",
"terser-webpack-plugin": "5.3.12",
"cytoscape": "^3.31.0",
"cytoscape-cose-bilkent": "4.1.0",
"grunt": "1.4.1",
"style-loader": "^4.0.0",
"css-loader": "^7.1.2",
"mini-css-extract-plugin": "^2.9.2",
"grunt-webpack": "^7.0.0",
"webpack-cli": "^6.0.1",
"ts-loader": "^9.5.2",
"browser-sync": "^3.0.3",
"grunt-browser-sync": "^2.2.0",
"grunt-contrib-clean": "2.0.0",
"grunt-contrib-concat": "2.0.0",
"grunt-contrib-cssmin": "5.0.0",
"grunt-contrib-uglify": "5.0.1",
"grunt-contrib-watch": "1.1.0",
"grunt-ts": "6.0.0-beta.22"
},
"dependencies": {
"cytoscape": "^3.31.0"
},
"comments": {
"version": "Π£ΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΠ΅ΠΊΡΡΡΡ Π²Π΅ΡΡΠΈΡ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°.",
"name": "ΠΠΌΡ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°.",
"private": "Π£ΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ ΠΏΡΠΎΠ΅ΠΊΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΈΠ²Π°ΡΠ½ΡΠΌ ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ Π² npm.",
"devDependencies": {
"css-minimizer-webpack-plugin": "ΠΠ»Π°Π³ΠΈΠ½ Π΄Π»Ρ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ CSS ΡΠ°ΠΉΠ»ΠΎΠ² Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΡΠ±ΠΎΡΠΊΠΈ Webpack.",
"terser-webpack-plugin": "ΠΠ»Π°Π³ΠΈΠ½ Π΄Π»Ρ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ JavaScript Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Terser.",
"cytoscape": "ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π³ΡΠ°ΡΠ°ΠΌΠΈ ΠΈ ΡΠ΅ΡΡΠΌΠΈ.",
"cytoscape-cose-bilkent": "ΠΠ»Π°Π³ΠΈΠ½ Π΄Π»Ρ Cytoscape, ΠΊΠΎΡΠΎΡΡΠΉ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠ·Π»ΠΎΠ².",
"grunt": "Π‘ΠΈΡΡΠ΅ΠΌΠ° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ Π·Π°Π΄Π°Ρ Π΄Π»Ρ Node.js, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ, ΠΌΠΈΠ½ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ.",
"style-loader": "ΠΠΎΠ°Π΄Π΅Ρ Π΄Π»Ρ ΠΈΠ½ΠΆΠ΅ΠΊΡΠΈΠΈ CSS Π² DOM ΡΠ΅ΡΠ΅Π· ΡΠ΅Π³ΠΈ `