Tutorial: Mulai menggunakan ASP.NET Core SignalR menggunakan TypeScript dan Webpack
Catatan
Ini bukan versi terbaru dari artikel ini. Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.
Penting
Informasi ini berkaitan dengan produk pra-rilis yang mungkin dimodifikasi secara substansial sebelum dirilis secara komersial. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.
Oleh Sébastien Sougnez
Tutorial ini menunjukkan penggunaan Webpack di aplikasi web ASP.NET Core SignalR untuk memaketkan dan membangun klien yang ditulis dalam TypeScript. Webpack memungkinkan pengembang untuk memaketkan dan membangun sumber daya sisi klien dari aplikasi web.
Dalam tutorial ini, Anda akan mempelajari cara:
- Membuat aplikasi ASP.NET Core SignalR
- SignalR Mengonfigurasi server
- Mengonfigurasi alur build menggunakan Webpack
- SignalR Mengonfigurasi klien TypeScript
- Mengaktifkan komunikasi antara klien dan server
Melihat atau mengunduh kode sampel (cara mengunduh)
Prasyarat
- Node.js dengan npm
Visual Studio 2022 dengan beban kerja ASP.NET serta pengembangan web.
Membuat aplikasi web ASP.NET Core
Secara default, Visual Studio menggunakan versi npm yang ditemukan di direktori penginstalannya. Untuk mengonfigurasi Visual Studio untuk mencari npm dalam PATH
variabel lingkungan:
Luncurkan Visual Studio. Di jendela mulai, pilih Lanjutkan tanpa kode.
Navigasi ke Opsi>Alat>Proyek dan Solusi>Manajemen>Paket Web Alat Web Eksternal.
$(PATH)
Pilih entri dari daftar. Pilih panah atas untuk memindahkan entri ke posisi kedua dalam daftar, dan pilih OK:.
Untuk membuat aplikasi web ASP.NET Core baru:
- Gunakan opsi menu File>Proyek Baru>dan pilih templat ASP.NET Core Empty. Pilih Selanjutnya.
- Beri nama proyek
SignalRWebpack
, dan pilih Buat. - Pilih .NET 8.0 (Dukungan Jangka Panjang) dari menu drop-down Kerangka Kerja . Pilih Buat.
Tambahkan paket NuGet Microsoft.TypeScript.MSBuild ke proyek:
- Di Penjelajah Solusi, klik kanan simpul proyek dan pilih Kelola Paket NuGet. Di tab Telusuri , cari
Microsoft.TypeScript.MSBuild
lalu pilih Instal di sebelah kanan untuk menginstal paket.
Visual Studio menambahkan paket NuGet di bawah simpul Dependensi di Penjelajah Solusi, memungkinkan kompilasi TypeScript dalam proyek.
Mengonfigurasi server
Di bagian ini, Anda mengonfigurasi aplikasi web ASP.NET Core untuk mengirim dan menerima SignalR pesan.
Dalam
Program.cs
, panggil AddSignalR:var builder = WebApplication.CreateBuilder(args); builder.Services.AddSignalR();
Sekali lagi, dalam
Program.cs
, panggil UseDefaultFiles dan UseStaticFiles:var app = builder.Build(); app.UseDefaultFiles(); app.UseStaticFiles();
Kode sebelumnya memungkinkan server menemukan dan melayani
index.html
file. File dilayani apakah pengguna memasukkan URL lengkapnya atau URL akar aplikasi web.Buat direktori baru bernama
Hubs
di akar proyek,SignalRWebpack/
, untuk SignalR kelas hub.Buat file baru,
Hubs/ChatHub.cs
, dengan kode berikut:using Microsoft.AspNetCore.SignalR; namespace SignalRWebpack.Hubs; public class ChatHub : Hub { public async Task NewMessage(long username, string message) => await Clients.All.SendAsync("messageReceived", username, message); }
Kode sebelumnya menyiarkan pesan yang diterima ke semua pengguna yang terhubung setelah server menerimanya. Tidak perlu memiliki metode generik
on
untuk menerima semua pesan. Metode yang dinamai sesuai dengan nama pesan sudah cukup.Dalam contoh ini:
- Klien TypeScript mengirim pesan yang diidentifikasi sebagai
newMessage
. - Metode C#
NewMessage
mengharapkan data yang dikirim oleh klien. - Panggilan dilakukan pada SendAsyncClients.All.
- Pesan yang diterima dikirim ke semua klien yang terhubung ke hub.
- Klien TypeScript mengirim pesan yang diidentifikasi sebagai
Tambahkan pernyataan berikut
using
di bagianProgram.cs
atas untuk mengatasiChatHub
referensi:using SignalRWebpack.Hubs;
Di
Program.cs
, petakan/hub
rute keChatHub
hub. Ganti kode yang ditampilkanHello World!
dengan kode berikut:app.MapHub<ChatHub>("/hub");
Mengonfigurasi klien
Di bagian ini, Anda membuat proyek Node.js untuk mengonversi TypeScript ke JavaScript dan memaketkan sumber daya sisi klien, termasuk HTML dan CSS, menggunakan Webpack.
Jalankan perintah berikut di akar proyek untuk membuat
package.json
file:npm init -y
Tambahkan properti yang disorot ke
package.json
file dan simpan perubahan file:{ "name": "SignalRWebpack", "version": "1.0.0", "private": true, "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" }
private
Mengatur properti untuktrue
mencegah peringatan penginstalan paket di langkah berikutnya.Instal paket npm yang diperlukan. Jalankan perintah berikut dari akar proyek:
npm i -D -E clean-webpack-plugin css-loader html-webpack-plugin mini-css-extract-plugin ts-loader typescript webpack webpack-cli
Opsi
-E
menonaktifkan perilaku default npm menulis operator rentang penerapan versi semantik kepackage.json
. Misalnya,"webpack": "5.76.1"
digunakan alih-alih"webpack": "^5.76.1"
. Opsi ini mencegah peningkatan yang tidak diinginkan ke versi paket yang lebih baru.Untuk informasi selengkapnya, lihat dokumentasi npm-install .
scripts
Ganti propertipackage.json
file dengan kode berikut:"scripts": { "build": "webpack --mode=development --watch", "release": "webpack --mode=production", "publish": "npm run release && dotnet publish -c Release" },
Skrip berikut didefinisikan:
build
: Menggabungkan sumber daya sisi klien dalam mode pengembangan dan mengawasi perubahan file. Pengamat file menyebabkan bundel diregenerasi setiap kali file proyek berubah. Opsi inimode
menonaktifkan pengoptimalan produksi, seperti pemecahan pohon dan minifikasi. hanya digunakanbuild
dalam pengembangan.release
: Menggabungkan sumber daya sisi klien dalam mode produksi.publish
: Menjalankanrelease
skrip untuk menggabungkan sumber daya sisi klien dalam mode produksi. Ini memanggil perintah terbitkan .NET CLI untuk menerbitkan aplikasi.
Buat file bernama
webpack.config.js
di akar proyek, dengan kode berikut:const path = require("path"); const HtmlWebpackPlugin = require("html-webpack-plugin"); const { CleanWebpackPlugin } = require("clean-webpack-plugin"); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); module.exports = { entry: "./src/index.ts", output: { path: path.resolve(__dirname, "wwwroot"), filename: "[name].[chunkhash].js", publicPath: "/", }, resolve: { extensions: [".js", ".ts"], }, module: { rules: [ { test: /\.ts$/, use: "ts-loader", }, { test: /\.css$/, use: [MiniCssExtractPlugin.loader, "css-loader"], }, ], }, plugins: [ new CleanWebpackPlugin(), new HtmlWebpackPlugin({ template: "./src/index.html", }), new MiniCssExtractPlugin({ filename: "css/[name].[chunkhash].css", }), ], };
File sebelumnya mengonfigurasi proses kompilasi Webpack:
- Properti
output
mengambil alih nilaidist
default . Bundel malah dipancarkan dalamwwwroot
direktori. - Array
resolve.extensions
termasuk.js
untuk mengimpor SignalR JavaScript klien.
- Properti
Buat direktori baru bernama
src
di akar proyek,SignalRWebpack/
, untuk kode klien.src
Salin direktori dan kontennya dari proyek sampel ke akar proyek.src
Direktori berisi file berikut:index.html
, yang mendefinisikan markup boilerplate beranda:<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>ASP.NET Core SignalR with TypeScript and Webpack</title> </head> <body> <div id="divMessages" class="messages"></div> <div class="input-zone"> <label id="lblMessage" for="tbMessage">Message:</label> <input id="tbMessage" class="input-zone-input" type="text" /> <button id="btnSend">Send</button> </div> </body> </html>
css/main.css
, yang menyediakan gaya CSS untuk beranda:*, *::before, *::after { box-sizing: border-box; } html, body { margin: 0; padding: 0; } .input-zone { align-items: center; display: flex; flex-direction: row; margin: 10px; } .input-zone-input { flex: 1; margin-right: 10px; } .message-author { font-weight: bold; } .messages { border: 1px solid #000; margin: 10px; max-height: 300px; min-height: 300px; overflow-y: auto; padding: 5px; }
tsconfig.json
, yang mengonfigurasi pengkompilasi TypeScript untuk menghasilkan JavaScript yang kompatibel dengan ECMAScript 5:{ "compilerOptions": { "target": "es5" } }
index.ts
:import * as signalR from "@microsoft/signalr"; import "./css/main.css"; const divMessages: HTMLDivElement = document.querySelector("#divMessages"); const tbMessage: HTMLInputElement = document.querySelector("#tbMessage"); const btnSend: HTMLButtonElement = document.querySelector("#btnSend"); const username = new Date().getTime(); const connection = new signalR.HubConnectionBuilder() .withUrl("/hub") .build(); connection.on("messageReceived", (username: string, message: string) => { const m = document.createElement("div"); m.innerHTML = `<div class="message-author">${username}</div><div>${message}</div>`; divMessages.appendChild(m); divMessages.scrollTop = divMessages.scrollHeight; }); connection.start().catch((err) => document.write(err)); tbMessage.addEventListener("keyup", (e: KeyboardEvent) => { if (e.key === "Enter") { send(); } }); btnSend.addEventListener("click", send); function send() { connection.send("newMessage", username, tbMessage.value) .then(() => (tbMessage.value = "")); }
Kode sebelumnya mengambil referensi ke elemen DOM dan melampirkan dua penanganan aktivitas:
keyup
: Diaktifkan saat pengguna mengetik ditbMessage
kotak teks dan memanggilsend
fungsi saat pengguna menekan tombol Enter .click
: Diaktifkan saat pengguna memilih tombol Kirim dan fungsi panggilansend
dipanggil.
Kelas
HubConnectionBuilder
membuat penyusun baru untuk mengonfigurasi koneksi server. Fungsi iniwithUrl
mengonfigurasi URL hub.SignalR memungkinkan pertukaran pesan antara klien dan server. Setiap pesan memiliki nama tertentu. Misalnya, pesan dengan nama
messageReceived
dapat menjalankan logika yang bertanggung jawab untuk menampilkan pesan baru di zona pesan. Mendengarkan pesan tertentu dapat dilakukan melaluion
fungsi . Sejumlah nama pesan dapat didengarkan. Dimungkinkan juga untuk meneruskan parameter ke pesan, seperti nama penulis dan konten pesan yang diterima. Setelah klien menerima pesan, elemen barudiv
dibuat dengan nama penulis dan konten pesan dalam atributnyainnerHTML
. Ini ditambahkan ke elemen utamadiv
yang menampilkan pesan.Mengirim pesan melalui koneksi WebSockets memerlukan panggilan
send
metode . Parameter pertama metode adalah nama pesan. Data pesan menghuni parameter lain. Dalam contoh ini, pesan yang diidentifikasi sebagainewMessage
dikirim ke server. Pesan terdiri dari nama pengguna dan input pengguna dari kotak teks. Jika pengiriman berfungsi, nilai kotak teks dikosongkan.
Jalankan perintah berikut di akar proyek:
npm i @microsoft/signalr @types/node
Perintah sebelumnya menginstal:
- Klien SignalR TypeScript, yang memungkinkan klien mengirim pesan ke server.
- Definisi jenis TypeScript untuk Node.js, yang memungkinkan pemeriksaan waktu kompilasi jenis Node.js.
Menguji aplikasi
Konfirmasikan bahwa aplikasi berfungsi dengan langkah-langkah berikut:
Jalankan Webpack dalam
release
mode. Menggunakan jendela Konsol Manajer Paket, jalankan perintah berikut di akar proyek.npm run release
Perintah ini menghasilkan aset sisi klien yang akan dilayani saat menjalankan aplikasi. Aset ditempatkan di
wwwroot
folder .Webpack menyelesaikan tugas-tugas berikut:
- Menghapus menyeluruh konten
wwwroot
direktori. - Mengonversi TypeScript ke JavaScript dalam proses yang dikenal sebagai terjemahan.
- Mangled JavaScript yang dihasilkan untuk mengurangi ukuran file dalam proses yang dikenal sebagai minifikasi.
- Menyalin file JavaScript, CSS, dan HTML yang diproses dari
src
kewwwroot
direktori. - Menyuntikkan elemen berikut ke
wwwroot/index.html
dalam file:- Tag
<link>
, mereferensikanwwwroot/main.<hash>.css
file. Tag ini ditempatkan segera sebelum tag penutup</head>
. - Tag
<script>
, merujuk pada file yang dikurangiwwwroot/main.<hash>.js
. Tag ini ditempatkan segera setelah tag penutup</title>
.
- Tag
- Menghapus menyeluruh konten
Pilih Debug>Mulai tanpa penelusuran kesalahan untuk meluncurkan aplikasi di browser tanpa melampirkan debugger. File
wwwroot/index.html
disajikan dihttps://localhost:<port>
.Jika ada kesalahan kompilasi, coba tutup dan buka kembali solusi.
Buka instans browser lain (browser apa pun) dan tempelkan URL di bilah alamat.
Pilih salah satu browser, ketik sesuatu di kotak teks Pesan , dan pilih tombol Kirim . Nama pengguna dan pesan unik ditampilkan di kedua halaman secara instan.
Langkah berikutnya
- Hub yang sangat ditik
- Autentikasi dan otorisasi di ASP.NET Core SignalR
- Protokol Hub MessagePack di SignalR untuk ASP.NET Core
Sumber Daya Tambahan:
Tutorial ini menunjukkan penggunaan Webpack di aplikasi web ASP.NET Core SignalR untuk memaketkan dan membangun klien yang ditulis dalam TypeScript. Webpack memungkinkan pengembang untuk memaketkan dan membangun sumber daya sisi klien dari aplikasi web.
Dalam tutorial ini, Anda akan mempelajari cara:
- Membuat aplikasi ASP.NET Core SignalR
- SignalR Mengonfigurasi server
- Mengonfigurasi alur build menggunakan Webpack
- SignalR Mengonfigurasi klien TypeScript
- Mengaktifkan komunikasi antara klien dan server
Melihat atau mengunduh kode sampel (cara mengunduh)
Prasyarat
- Node.js dengan npm
Visual Studio 2022 dengan beban kerja ASP.NET serta pengembangan web.
Membuat aplikasi web ASP.NET Core
Secara default, Visual Studio menggunakan versi npm yang ditemukan di direktori penginstalannya. Untuk mengonfigurasi Visual Studio untuk mencari npm dalam PATH
variabel lingkungan:
Luncurkan Visual Studio. Di jendela mulai, pilih Lanjutkan tanpa kode.
Navigasi ke Opsi>Alat>Proyek dan Solusi>Manajemen>Paket Web Alat Web Eksternal.
$(PATH)
Pilih entri dari daftar. Pilih panah atas untuk memindahkan entri ke posisi kedua dalam daftar, dan pilih OK:.
Untuk membuat aplikasi web ASP.NET Core baru:
- Gunakan opsi menu File>Proyek Baru>dan pilih templat ASP.NET Core Empty. Pilih Selanjutnya.
- Beri nama proyek
SignalRWebpack
, dan pilih Buat. - Pilih
.NET 7.0 (Standard Term Support)
dari menu drop-down Kerangka Kerja . Pilih Buat.
Tambahkan paket NuGet Microsoft.TypeScript.MSBuild ke proyek:
- Di Penjelajah Solusi, klik kanan simpul proyek dan pilih Kelola Paket NuGet. Di tab Telusuri , cari
Microsoft.TypeScript.MSBuild
lalu pilih Instal di sebelah kanan untuk menginstal paket.
Visual Studio menambahkan paket NuGet di bawah simpul Dependensi di Penjelajah Solusi, memungkinkan kompilasi TypeScript dalam proyek.
Mengonfigurasi server
Di bagian ini, Anda mengonfigurasi aplikasi web ASP.NET Core untuk mengirim dan menerima SignalR pesan.
Dalam
Program.cs
, panggil AddSignalR:var builder = WebApplication.CreateBuilder(args); builder.Services.AddSignalR();
Sekali lagi, dalam
Program.cs
, panggil UseDefaultFiles dan UseStaticFiles:var app = builder.Build(); app.UseDefaultFiles(); app.UseStaticFiles();
Kode sebelumnya memungkinkan server menemukan dan melayani
index.html
file. File dilayani apakah pengguna memasukkan URL lengkapnya atau URL akar aplikasi web.Buat direktori baru bernama
Hubs
di akar proyek,SignalRWebpack/
, untuk SignalR kelas hub.Buat file baru,
Hubs/ChatHub.cs
, dengan kode berikut:using Microsoft.AspNetCore.SignalR; namespace SignalRWebpack.Hubs; public class ChatHub : Hub { public async Task NewMessage(long username, string message) => await Clients.All.SendAsync("messageReceived", username, message); }
Kode sebelumnya menyiarkan pesan yang diterima ke semua pengguna yang terhubung setelah server menerimanya. Tidak perlu memiliki metode generik
on
untuk menerima semua pesan. Metode yang dinamai sesuai dengan nama pesan sudah cukup.Dalam contoh ini:
- Klien TypeScript mengirim pesan yang diidentifikasi sebagai
newMessage
. - Metode C#
NewMessage
mengharapkan data yang dikirim oleh klien. - Panggilan dilakukan pada SendAsyncClients.All.
- Pesan yang diterima dikirim ke semua klien yang terhubung ke hub.
- Klien TypeScript mengirim pesan yang diidentifikasi sebagai
Tambahkan pernyataan berikut
using
di bagianProgram.cs
atas untuk mengatasiChatHub
referensi:using SignalRWebpack.Hubs;
Di
Program.cs
, petakan/hub
rute keChatHub
hub. Ganti kode yang ditampilkanHello World!
dengan kode berikut:app.MapHub<ChatHub>("/hub");
Mengonfigurasi klien
Di bagian ini, Anda membuat proyek Node.js untuk mengonversi TypeScript ke JavaScript dan memaketkan sumber daya sisi klien, termasuk HTML dan CSS, menggunakan Webpack.
Jalankan perintah berikut di akar proyek untuk membuat
package.json
file:npm init -y
Tambahkan properti yang disorot ke
package.json
file dan simpan perubahan file:{ "name": "SignalRWebpack", "version": "1.0.0", "private": true, "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" }
private
Mengatur properti untuktrue
mencegah peringatan penginstalan paket di langkah berikutnya.Instal paket npm yang diperlukan. Jalankan perintah berikut dari akar proyek:
npm i -D -E clean-webpack-plugin css-loader html-webpack-plugin mini-css-extract-plugin ts-loader typescript webpack webpack-cli
Opsi
-E
menonaktifkan perilaku default npm menulis operator rentang penerapan versi semantik kepackage.json
. Misalnya,"webpack": "5.76.1"
digunakan alih-alih"webpack": "^5.76.1"
. Opsi ini mencegah peningkatan yang tidak diinginkan ke versi paket yang lebih baru.Untuk informasi selengkapnya, lihat dokumentasi npm-install .
scripts
Ganti propertipackage.json
file dengan kode berikut:"scripts": { "build": "webpack --mode=development --watch", "release": "webpack --mode=production", "publish": "npm run release && dotnet publish -c Release" },
Skrip berikut didefinisikan:
build
: Menggabungkan sumber daya sisi klien dalam mode pengembangan dan mengawasi perubahan file. Pengamat file menyebabkan bundel diregenerasi setiap kali file proyek berubah. Opsi inimode
menonaktifkan pengoptimalan produksi, seperti pemecahan pohon dan minifikasi. hanya digunakanbuild
dalam pengembangan.release
: Menggabungkan sumber daya sisi klien dalam mode produksi.publish
: Menjalankanrelease
skrip untuk menggabungkan sumber daya sisi klien dalam mode produksi. Ini memanggil perintah terbitkan .NET CLI untuk menerbitkan aplikasi.
Buat file bernama
webpack.config.js
di akar proyek, dengan kode berikut:const path = require("path"); const HtmlWebpackPlugin = require("html-webpack-plugin"); const { CleanWebpackPlugin } = require("clean-webpack-plugin"); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); module.exports = { entry: "./src/index.ts", output: { path: path.resolve(__dirname, "wwwroot"), filename: "[name].[chunkhash].js", publicPath: "/", }, resolve: { extensions: [".js", ".ts"], }, module: { rules: [ { test: /\.ts$/, use: "ts-loader", }, { test: /\.css$/, use: [MiniCssExtractPlugin.loader, "css-loader"], }, ], }, plugins: [ new CleanWebpackPlugin(), new HtmlWebpackPlugin({ template: "./src/index.html", }), new MiniCssExtractPlugin({ filename: "css/[name].[chunkhash].css", }), ], };
File sebelumnya mengonfigurasi proses kompilasi Webpack:
- Properti
output
mengambil alih nilaidist
default . Bundel malah dipancarkan dalamwwwroot
direktori. - Array
resolve.extensions
termasuk.js
untuk mengimpor SignalR JavaScript klien.
- Properti
src
Salin direktori dan kontennya dari proyek sampel ke akar proyek.src
Direktori berisi file berikut:index.html
, yang mendefinisikan markup boilerplate beranda:<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>ASP.NET Core SignalR with TypeScript and Webpack</title> </head> <body> <div id="divMessages" class="messages"></div> <div class="input-zone"> <label id="lblMessage" for="tbMessage">Message:</label> <input id="tbMessage" class="input-zone-input" type="text" /> <button id="btnSend">Send</button> </div> </body> </html>
css/main.css
, yang menyediakan gaya CSS untuk beranda:*, *::before, *::after { box-sizing: border-box; } html, body { margin: 0; padding: 0; } .input-zone { align-items: center; display: flex; flex-direction: row; margin: 10px; } .input-zone-input { flex: 1; margin-right: 10px; } .message-author { font-weight: bold; } .messages { border: 1px solid #000; margin: 10px; max-height: 300px; min-height: 300px; overflow-y: auto; padding: 5px; }
tsconfig.json
, yang mengonfigurasi pengkompilasi TypeScript untuk menghasilkan JavaScript yang kompatibel dengan ECMAScript 5:{ "compilerOptions": { "target": "es5" } }
index.ts
:import * as signalR from "@microsoft/signalr"; import "./css/main.css"; const divMessages: HTMLDivElement = document.querySelector("#divMessages"); const tbMessage: HTMLInputElement = document.querySelector("#tbMessage"); const btnSend: HTMLButtonElement = document.querySelector("#btnSend"); const username = new Date().getTime(); const connection = new signalR.HubConnectionBuilder() .withUrl("/hub") .build(); connection.on("messageReceived", (username: string, message: string) => { const m = document.createElement("div"); m.innerHTML = `<div class="message-author">${username}</div><div>${message}</div>`; divMessages.appendChild(m); divMessages.scrollTop = divMessages.scrollHeight; }); connection.start().catch((err) => document.write(err)); tbMessage.addEventListener("keyup", (e: KeyboardEvent) => { if (e.key === "Enter") { send(); } }); btnSend.addEventListener("click", send); function send() { connection.send("newMessage", username, tbMessage.value) .then(() => (tbMessage.value = "")); }
Kode sebelumnya mengambil referensi ke elemen DOM dan melampirkan dua penanganan aktivitas:
keyup
: Diaktifkan saat pengguna mengetik ditbMessage
kotak teks dan memanggilsend
fungsi saat pengguna menekan tombol Enter .click
: Diaktifkan saat pengguna memilih tombol Kirim dan fungsi panggilansend
dipanggil.
Kelas
HubConnectionBuilder
membuat penyusun baru untuk mengonfigurasi koneksi server. Fungsi iniwithUrl
mengonfigurasi URL hub.SignalR memungkinkan pertukaran pesan antara klien dan server. Setiap pesan memiliki nama tertentu. Misalnya, pesan dengan nama
messageReceived
dapat menjalankan logika yang bertanggung jawab untuk menampilkan pesan baru di zona pesan. Mendengarkan pesan tertentu dapat dilakukan melaluion
fungsi . Sejumlah nama pesan dapat didengarkan. Dimungkinkan juga untuk meneruskan parameter ke pesan, seperti nama penulis dan konten pesan yang diterima. Setelah klien menerima pesan, elemen barudiv
dibuat dengan nama penulis dan konten pesan dalam atributnyainnerHTML
. Ini ditambahkan ke elemen utamadiv
yang menampilkan pesan.Mengirim pesan melalui koneksi WebSockets memerlukan panggilan
send
metode . Parameter pertama metode adalah nama pesan. Data pesan menghuni parameter lain. Dalam contoh ini, pesan yang diidentifikasi sebagainewMessage
dikirim ke server. Pesan terdiri dari nama pengguna dan input pengguna dari kotak teks. Jika pengiriman berfungsi, nilai kotak teks dikosongkan.
Jalankan perintah berikut di akar proyek:
npm i @microsoft/signalr @types/node
Perintah sebelumnya menginstal:
- Klien SignalR TypeScript, yang memungkinkan klien mengirim pesan ke server.
- Definisi jenis TypeScript untuk Node.js, yang memungkinkan pemeriksaan waktu kompilasi jenis Node.js.
Menguji aplikasi
Konfirmasikan bahwa aplikasi berfungsi dengan langkah-langkah berikut:
Jalankan Webpack dalam
release
mode. Menggunakan jendela Konsol Manajer Paket, jalankan perintah berikut di akar proyek.npm run release
Perintah ini menghasilkan aset sisi klien yang akan dilayani saat menjalankan aplikasi. Aset ditempatkan di
wwwroot
folder .Webpack menyelesaikan tugas-tugas berikut:
- Menghapus menyeluruh konten
wwwroot
direktori. - Mengonversi TypeScript ke JavaScript dalam proses yang dikenal sebagai terjemahan.
- Mangled JavaScript yang dihasilkan untuk mengurangi ukuran file dalam proses yang dikenal sebagai minifikasi.
- Menyalin file JavaScript, CSS, dan HTML yang diproses dari
src
kewwwroot
direktori. - Menyuntikkan elemen berikut ke
wwwroot/index.html
dalam file:- Tag
<link>
, mereferensikanwwwroot/main.<hash>.css
file. Tag ini ditempatkan segera sebelum tag penutup</head>
. - Tag
<script>
, merujuk pada file yang dikurangiwwwroot/main.<hash>.js
. Tag ini ditempatkan segera setelah tag penutup</title>
.
- Tag
- Menghapus menyeluruh konten
Pilih Debug>Mulai tanpa penelusuran kesalahan untuk meluncurkan aplikasi di browser tanpa melampirkan debugger. File
wwwroot/index.html
disajikan dihttps://localhost:<port>
.Jika ada kesalahan kompilasi, coba tutup dan buka kembali solusi.
Buka instans browser lain (browser apa pun) dan tempelkan URL di bilah alamat.
Pilih salah satu browser, ketik sesuatu di kotak teks Pesan , dan pilih tombol Kirim . Nama pengguna dan pesan unik ditampilkan di kedua halaman secara instan.
Langkah berikutnya
- Hub yang sangat ditik
- Autentikasi dan otorisasi di ASP.NET Core SignalR
- Protokol Hub MessagePack di SignalR untuk ASP.NET Core
Sumber Daya Tambahan:
Tutorial ini menunjukkan penggunaan Webpack di aplikasi web ASP.NET Core SignalR untuk memaketkan dan membangun klien yang ditulis dalam TypeScript. Webpack memungkinkan pengembang untuk memaketkan dan membangun sumber daya sisi klien dari aplikasi web.
Dalam tutorial ini, Anda akan mempelajari cara:
- Membuat aplikasi ASP.NET Core SignalR
- SignalR Mengonfigurasi server
- Mengonfigurasi alur build menggunakan Webpack
- SignalR Mengonfigurasi klien TypeScript
- Mengaktifkan komunikasi antara klien dan server
Melihat atau mengunduh kode sampel (cara mengunduh)
Prasyarat
- Node.js dengan npm
- Visual Studio 2022 dengan beban kerja ASP.NET serta pengembangan web.
- .NET 6.0 SDK
Membuat aplikasi web ASP.NET Core
Secara default, Visual Studio menggunakan versi npm yang ditemukan di direktori penginstalannya. Untuk mengonfigurasi Visual Studio untuk mencari npm dalam PATH
variabel lingkungan:
Luncurkan Visual Studio. Di jendela mulai, pilih Lanjutkan tanpa kode.
Navigasi ke Opsi>Alat>Proyek dan Solusi>Manajemen>Paket Web Alat Web Eksternal.
$(PATH)
Pilih entri dari daftar. Pilih panah atas untuk memindahkan entri ke posisi kedua dalam daftar, dan pilih OK:.
Untuk membuat aplikasi web ASP.NET Core baru:
- Gunakan opsi menu File>Proyek Baru>dan pilih templat ASP.NET Core Empty. Pilih Selanjutnya.
- Beri nama proyek
SignalRWebpack
, dan pilih Buat. - Pilih
.NET 6.0 (Long Term Support)
dari menu drop-down Kerangka Kerja . Pilih Buat.
Tambahkan paket NuGet Microsoft.TypeScript.MSBuild ke proyek:
- Di Penjelajah Solusi, klik kanan simpul proyek dan pilih Kelola Paket NuGet. Di tab Telusuri , cari
Microsoft.TypeScript.MSBuild
lalu pilih Instal di sebelah kanan untuk menginstal paket.
Visual Studio menambahkan paket NuGet di bawah simpul Dependensi di Penjelajah Solusi, memungkinkan kompilasi TypeScript dalam proyek.
Mengonfigurasi server
Di bagian ini, Anda mengonfigurasi aplikasi web ASP.NET Core untuk mengirim dan menerima SignalR pesan.
Dalam
Program.cs
, panggil AddSignalR:var builder = WebApplication.CreateBuilder(args); builder.Services.AddSignalR();
Sekali lagi, dalam
Program.cs
, panggil UseDefaultFiles dan UseStaticFiles:var app = builder.Build(); app.UseDefaultFiles(); app.UseStaticFiles();
Kode sebelumnya memungkinkan server menemukan dan melayani
index.html
file. File dilayani apakah pengguna memasukkan URL lengkapnya atau URL akar aplikasi web.Buat direktori baru bernama
Hubs
di akar proyek,SignalRWebpack/
, untuk SignalR kelas hub.Buat file baru,
Hubs/ChatHub.cs
, dengan kode berikut:using Microsoft.AspNetCore.SignalR; namespace SignalRWebpack.Hubs; public class ChatHub : Hub { public async Task NewMessage(long username, string message) => await Clients.All.SendAsync("messageReceived", username, message); }
Kode sebelumnya menyiarkan pesan yang diterima ke semua pengguna yang terhubung setelah server menerimanya. Tidak perlu memiliki metode generik
on
untuk menerima semua pesan. Metode yang dinamai sesuai dengan nama pesan sudah cukup.Dalam contoh ini, klien TypeScript mengirim pesan yang diidentifikasi sebagai
newMessage
. Metode C#NewMessage
mengharapkan data yang dikirim oleh klien. Panggilan dilakukan pada SendAsyncClients.All. Pesan yang diterima dikirim ke semua klien yang terhubung ke hub.Tambahkan pernyataan berikut
using
di bagianProgram.cs
atas untuk mengatasiChatHub
referensi:using SignalRWebpack.Hubs;
Di
Program.cs
, petakan/hub
rute keChatHub
hub. Ganti kode yang ditampilkanHello World!
dengan kode berikut:app.MapHub<ChatHub>("/hub");
Mengonfigurasi klien
Di bagian ini, Anda membuat proyek Node.js untuk mengonversi TypeScript ke JavaScript dan memaketkan sumber daya sisi klien, termasuk HTML dan CSS, menggunakan Webpack.
Jalankan perintah berikut di akar proyek untuk membuat
package.json
file:npm init -y
Tambahkan properti yang disorot ke
package.json
file dan simpan perubahan file:{ "name": "SignalRWebpack", "version": "1.0.0", "private": true, "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" }
private
Mengatur properti untuktrue
mencegah peringatan penginstalan paket di langkah berikutnya.Instal paket npm yang diperlukan. Jalankan perintah berikut dari akar proyek:
npm i -D -E clean-webpack-plugin css-loader html-webpack-plugin mini-css-extract-plugin ts-loader typescript webpack webpack-cli
Opsi
-E
menonaktifkan perilaku default npm menulis operator rentang penerapan versi semantik kepackage.json
. Misalnya,"webpack": "5.70.0"
digunakan alih-alih"webpack": "^5.70.0"
. Opsi ini mencegah peningkatan yang tidak diinginkan ke versi paket yang lebih baru.Untuk informasi selengkapnya, lihat dokumentasi npm-install .
scripts
Ganti propertipackage.json
file dengan kode berikut:"scripts": { "build": "webpack --mode=development --watch", "release": "webpack --mode=production", "publish": "npm run release && dotnet publish -c Release" },
Skrip berikut didefinisikan:
build
: Menggabungkan sumber daya sisi klien dalam mode pengembangan dan mengawasi perubahan file. Pengamat file menyebabkan bundel diregenerasi setiap kali file proyek berubah. Opsi inimode
menonaktifkan pengoptimalan produksi, seperti pemecahan pohon dan minifikasi. hanya digunakanbuild
dalam pengembangan.release
: Menggabungkan sumber daya sisi klien dalam mode produksi.publish
: Menjalankanrelease
skrip untuk menggabungkan sumber daya sisi klien dalam mode produksi. Ini memanggil perintah terbitkan .NET CLI untuk menerbitkan aplikasi.
Buat file bernama
webpack.config.js
di akar proyek, dengan kode berikut:const path = require("path"); const HtmlWebpackPlugin = require("html-webpack-plugin"); const { CleanWebpackPlugin } = require("clean-webpack-plugin"); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); module.exports = { entry: "./src/index.ts", output: { path: path.resolve(__dirname, "wwwroot"), filename: "[name].[chunkhash].js", publicPath: "/", }, resolve: { extensions: [".js", ".ts"], }, module: { rules: [ { test: /\.ts$/, use: "ts-loader", }, { test: /\.css$/, use: [MiniCssExtractPlugin.loader, "css-loader"], }, ], }, plugins: [ new CleanWebpackPlugin(), new HtmlWebpackPlugin({ template: "./src/index.html", }), new MiniCssExtractPlugin({ filename: "css/[name].[chunkhash].css", }), ], };
File sebelumnya mengonfigurasi proses kompilasi Webpack:
- Properti
output
mengambil alih nilaidist
default . Bundel malah dipancarkan dalamwwwroot
direktori. - Array
resolve.extensions
termasuk.js
untuk mengimpor SignalR JavaScript klien.
- Properti
src
Salin direktori dan kontennya dari proyek sampel ke akar proyek.src
Direktori berisi file berikut:index.html
, yang mendefinisikan markup boilerplate beranda:<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>ASP.NET Core SignalR with TypeScript and Webpack</title> </head> <body> <div id="divMessages" class="messages"></div> <div class="input-zone"> <label id="lblMessage" for="tbMessage">Message:</label> <input id="tbMessage" class="input-zone-input" type="text" /> <button id="btnSend">Send</button> </div> </body> </html>
css/main.css
, yang menyediakan gaya CSS untuk beranda:*, *::before, *::after { box-sizing: border-box; } html, body { margin: 0; padding: 0; } .input-zone { align-items: center; display: flex; flex-direction: row; margin: 10px; } .input-zone-input { flex: 1; margin-right: 10px; } .message-author { font-weight: bold; } .messages { border: 1px solid #000; margin: 10px; max-height: 300px; min-height: 300px; overflow-y: auto; padding: 5px; }
tsconfig.json
, yang mengonfigurasi pengkompilasi TypeScript untuk menghasilkan JavaScript yang kompatibel dengan ECMAScript 5:{ "compilerOptions": { "target": "es5" } }
index.ts
:import * as signalR from "@microsoft/signalr"; import "./css/main.css"; const divMessages: HTMLDivElement = document.querySelector("#divMessages"); const tbMessage: HTMLInputElement = document.querySelector("#tbMessage"); const btnSend: HTMLButtonElement = document.querySelector("#btnSend"); const username = new Date().getTime(); const connection = new signalR.HubConnectionBuilder() .withUrl("/hub") .build(); connection.on("messageReceived", (username: string, message: string) => { const m = document.createElement("div"); m.innerHTML = `<div class="message-author">${username}</div><div>${message}</div>`; divMessages.appendChild(m); divMessages.scrollTop = divMessages.scrollHeight; }); connection.start().catch((err) => document.write(err)); tbMessage.addEventListener("keyup", (e: KeyboardEvent) => { if (e.key === "Enter") { send(); } }); btnSend.addEventListener("click", send); function send() { connection.send("newMessage", username, tbMessage.value) .then(() => (tbMessage.value = "")); }
Kode sebelumnya mengambil referensi ke elemen DOM dan melampirkan dua penanganan aktivitas:
keyup
: Diaktifkan saat pengguna mengetik ditbMessage
kotak teks dan memanggilsend
fungsi saat pengguna menekan tombol Enter .click
: Diaktifkan saat pengguna memilih tombol Kirim dan fungsi panggilansend
dipanggil.
Kelas
HubConnectionBuilder
membuat penyusun baru untuk mengonfigurasi koneksi server. Fungsi iniwithUrl
mengonfigurasi URL hub.SignalR memungkinkan pertukaran pesan antara klien dan server. Setiap pesan memiliki nama tertentu. Misalnya, pesan dengan nama
messageReceived
dapat menjalankan logika yang bertanggung jawab untuk menampilkan pesan baru di zona pesan. Mendengarkan pesan tertentu dapat dilakukan melaluion
fungsi . Sejumlah nama pesan dapat didengarkan. Dimungkinkan juga untuk meneruskan parameter ke pesan, seperti nama penulis dan konten pesan yang diterima. Setelah klien menerima pesan, elemen barudiv
dibuat dengan nama penulis dan konten pesan dalam atributnyainnerHTML
. Ini ditambahkan ke elemen utamadiv
yang menampilkan pesan.Mengirim pesan melalui koneksi WebSockets memerlukan panggilan
send
metode . Parameter pertama metode adalah nama pesan. Data pesan menghuni parameter lain. Dalam contoh ini, pesan yang diidentifikasi sebagainewMessage
dikirim ke server. Pesan terdiri dari nama pengguna dan input pengguna dari kotak teks. Jika pengiriman berfungsi, nilai kotak teks dikosongkan.Jalankan perintah berikut di akar proyek:
npm i @microsoft/signalr @types/node
Perintah sebelumnya menginstal:
- Klien SignalR TypeScript, yang memungkinkan klien mengirim pesan ke server.
- Definisi jenis TypeScript untuk Node.js, yang memungkinkan pemeriksaan waktu kompilasi jenis Node.js.
Menguji aplikasi
Konfirmasikan bahwa aplikasi berfungsi dengan langkah-langkah berikut:
Jalankan Webpack dalam
release
mode. Menggunakan jendela Konsol Manajer Paket, jalankan perintah berikut di akar proyek. Jika Anda tidak berada di akar proyek, masukkancd SignalRWebpack
sebelum memasukkan perintah .npm run release
Perintah ini menghasilkan aset sisi klien yang akan dilayani saat menjalankan aplikasi. Aset ditempatkan di
wwwroot
folder .Webpack menyelesaikan tugas-tugas berikut:
- Menghapus menyeluruh konten
wwwroot
direktori. - Mengonversi TypeScript ke JavaScript dalam proses yang dikenal sebagai terjemahan.
- Mangled JavaScript yang dihasilkan untuk mengurangi ukuran file dalam proses yang dikenal sebagai minifikasi.
- Menyalin file JavaScript, CSS, dan HTML yang diproses dari
src
kewwwroot
direktori. - Menyuntikkan elemen berikut ke
wwwroot/index.html
dalam file:- Tag
<link>
, mereferensikanwwwroot/main.<hash>.css
file. Tag ini ditempatkan segera sebelum tag penutup</head>
. - Tag
<script>
, merujuk pada file yang dikurangiwwwroot/main.<hash>.js
. Tag ini ditempatkan segera setelah tag penutup</title>
.
- Tag
- Menghapus menyeluruh konten
Pilih Debug>Mulai tanpa penelusuran kesalahan untuk meluncurkan aplikasi di browser tanpa melampirkan debugger. File
wwwroot/index.html
disajikan dihttps://localhost:<port>
.Jika Anda mendapatkan kesalahan kompilasi, coba tutup dan buka kembali solusinya.
Buka instans browser lain (browser apa pun) dan tempelkan URL di bilah alamat.
Pilih salah satu browser, ketik sesuatu di kotak teks Pesan , dan pilih tombol Kirim . Nama pengguna dan pesan unik ditampilkan di kedua halaman secara instan.
Langkah berikutnya
- Hub yang sangat ditik
- Autentikasi dan otorisasi di ASP.NET Core SignalR
- Protokol Hub MessagePack di SignalR untuk ASP.NET Core
Sumber Daya Tambahan:
Tutorial ini menunjukkan penggunaan Webpack di aplikasi web ASP.NET Core SignalR untuk memaketkan dan membangun klien yang ditulis dalam TypeScript. Webpack memungkinkan pengembang untuk memaketkan dan membangun sumber daya sisi klien dari aplikasi web.
Dalam tutorial ini, Anda akan mempelajari cara:
- Perancah aplikasi starter ASP.NET Core SignalR
- SignalR Mengonfigurasi klien TypeScript
- Mengonfigurasi alur build menggunakan Webpack
- SignalR Mengonfigurasi server
- Mengaktifkan komunikasi antara klien dan server
Melihat atau mengunduh kode sampel (cara mengunduh)
Prasyarat
- Visual Studio 2019 dengan beban kerja pengembangan ASP.NET dan web
- .NET Core SDK 3.0 atau yang lebih baru
- Node.js dengan npm
Membuat aplikasi web ASP.NET Core
Konfigurasikan Visual Studio untuk mencari npm dalam variabel lingkungan PATH . Secara default, Visual Studio menggunakan versi npm yang ditemukan di direktori penginstalannya. Ikuti petunjuk berikut di Visual Studio:
Luncurkan Visual Studio. Di jendela mulai, pilih Lanjutkan tanpa kode.
Navigasi ke Opsi>Alat>Proyek dan Solusi>Manajemen>Paket Web Alat Web Eksternal.
Pilih entri $(PATH) dari daftar. Pilih panah atas untuk memindahkan entri ke posisi kedua dalam daftar, dan pilih OK.
.
Konfigurasi Visual Studio selesai.
- Gunakan opsi menu Proyek Baru>File>dan pilih templat Aplikasi Web inti ASP.NET. Pilih Selanjutnya.
- Beri nama proyek *SignalRWebPac'', dan pilih Buat.
- Pilih .NET Core dari drop-down kerangka kerja target, dan pilih ASP.NET Core 3.1 dari menu drop-down pemilih kerangka kerja. Pilih Templat kosong, dan pilih Buat.
Microsoft.TypeScript.MSBuild
Tambahkan paket ke proyek:
- Di Penjelajah Solusi (panel kanan), klik kanan simpul proyek dan pilih Kelola Paket NuGet. Di tab Telusuri , cari
Microsoft.TypeScript.MSBuild
, lalu klik Instal di sebelah kanan untuk menginstal paket.
Visual Studio menambahkan paket NuGet di bawah simpul Dependensi di Penjelajah Solusi, memungkinkan kompilasi TypeScript dalam proyek.
Mengonfigurasi Webpack dan TypeScript
Langkah-langkah berikut mengonfigurasi konversi TypeScript ke JavaScript dan bundling sumber daya sisi klien.
Jalankan perintah berikut di akar proyek untuk membuat
package.json
file:npm init -y
Tambahkan properti yang disorot ke
package.json
file dan simpan perubahan file:{ "name": "SignalRWebPack", "version": "1.0.0", "private": true, "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" }
private
Mengatur properti untuktrue
mencegah peringatan penginstalan paket di langkah berikutnya.Instal paket npm yang diperlukan. Jalankan perintah berikut dari akar proyek:
npm i -D -E clean-webpack-plugin@3.0.0 css-loader@3.4.2 html-webpack-plugin@3.2.0 mini-css-extract-plugin@0.9.0 ts-loader@6.2.1 typescript@3.7.5 webpack@4.41.5 webpack-cli@3.3.10
Beberapa detail perintah yang perlu diperhatikan:
- Nomor versi mengikuti
@
tanda untuk setiap nama paket. npm menginstal versi paket tertentu tersebut. - Opsi ini
-E
menonaktifkan perilaku default npm menulis operator rentang penerapan versi semantik ke *paketjson
. Misalnya,"webpack": "4.41.5"
digunakan alih-alih"webpack": "^4.41.5"
. Opsi ini mencegah peningkatan yang tidak diinginkan ke versi paket yang lebih baru.
Lihat dokumen npm-install untuk detail selengkapnya.
- Nomor versi mengikuti
scripts
Ganti propertipackage.json
file dengan kode berikut:"scripts": { "build": "webpack --mode=development --watch", "release": "webpack --mode=production", "publish": "npm run release && dotnet publish -c Release" },
Beberapa penjelasan tentang skrip:
build
: Menggabungkan sumber daya sisi klien dalam mode pengembangan dan mengawasi perubahan file. Pengamat file menyebabkan bundel diregenerasi setiap kali file proyek berubah. Opsi inimode
menonaktifkan pengoptimalan produksi, seperti pemecahan pohon dan minifikasi. Hanya digunakanbuild
dalam pengembangan.release
: Menggabungkan sumber daya sisi klien dalam mode produksi.publish
: Menjalankanrelease
skrip untuk menggabungkan sumber daya sisi klien dalam mode produksi. Ini memanggil perintah publikasi .NET Core CLI untuk menerbitkan aplikasi.
Buat file bernama
webpack.config.js
, di akar proyek, dengan kode berikut:const path = require("path"); const HtmlWebpackPlugin = require("html-webpack-plugin"); const { CleanWebpackPlugin } = require("clean-webpack-plugin"); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); module.exports = { entry: "./src/index.ts", output: { path: path.resolve(__dirname, "wwwroot"), filename: "[name].[chunkhash].js", publicPath: "/" }, resolve: { extensions: [".js", ".ts"] }, module: { rules: [ { test: /\.ts$/, use: "ts-loader" }, { test: /\.css$/, use: [MiniCssExtractPlugin.loader, "css-loader"] } ] }, plugins: [ new CleanWebpackPlugin(), new HtmlWebpackPlugin({ template: "./src/index.html" }), new MiniCssExtractPlugin({ filename: "css/[name].[chunkhash].css" }) ] };
File sebelumnya mengonfigurasi kompilasi Webpack. Beberapa detail konfigurasi yang perlu diperhatikan:
- Properti
output
mengambil alih nilaidist
default . Bundel malah dipancarkan dalamwwwroot
direktori. - Array
resolve.extensions
termasuk.js
untuk mengimpor SignalR JavaScript klien.
- Properti
Buat direktori src baru di akar proyek untuk menyimpan aset sisi klien proyek.
Buat
src/index.html
dengan markup berikut.<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>ASP.NET Core SignalR</title> </head> <body> <div id="divMessages" class="messages"> </div> <div class="input-zone"> <label id="lblMessage" for="tbMessage">Message:</label> <input id="tbMessage" class="input-zone-input" type="text" /> <button id="btnSend">Send</button> </div> </body> </html>
HTML sebelumnya mendefinisikan markup boilerplate beranda.
Buat direktori src/css baru. Tujuannya adalah untuk menyimpan file proyek
.css
.Buat
src/css/main.css
dengan CSS berikut:*, *::before, *::after { box-sizing: border-box; } html, body { margin: 0; padding: 0; } .input-zone { align-items: center; display: flex; flex-direction: row; margin: 10px; } .input-zone-input { flex: 1; margin-right: 10px; } .message-author { font-weight: bold; } .messages { border: 1px solid #000; margin: 10px; max-height: 300px; min-height: 300px; overflow-y: auto; padding: 5px; }
File sebelumnya menata
main.css
aplikasi.Buat
src/tsconfig.json
dengan ON berikut JS:{ "compilerOptions": { "target": "es5" } }
Kode sebelumnya mengonfigurasi pengkompilasi TypeScript untuk menghasilkan JavaScript yang kompatibel dengan ECMAScript 5.
Buat
src/index.ts
dengan kode berikut:import "./css/main.css"; const divMessages: HTMLDivElement = document.querySelector("#divMessages"); const tbMessage: HTMLInputElement = document.querySelector("#tbMessage"); const btnSend: HTMLButtonElement = document.querySelector("#btnSend"); const username = new Date().getTime(); tbMessage.addEventListener("keyup", (e: KeyboardEvent) => { if (e.key === "Enter") { send(); } }); btnSend.addEventListener("click", send); function send() { }
TypeScript sebelumnya mengambil referensi ke elemen DOM dan melampirkan dua penanganan aktivitas:
keyup
: Kejadian ini diaktifkan saat pengguna mengetik ditbMessage
kotak teks. Fungsisend
ini dipanggil ketika pengguna menekan tombol Enter .click
: Kejadian ini diaktifkan saat pengguna memilih tombol Kirim . Fungsisend
ini dipanggil.
Mengonfigurasikan aplikasi
Di
Startup.Configure
, tambahkan panggilan ke UseDefaultFiles(IApplicationBuilder) dan UseStaticFiles(IApplicationBuilder).public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseRouting(); app.UseDefaultFiles(); app.UseStaticFiles(); app.UseEndpoints(endpoints => { endpoints.MapHub<ChatHub>("/hub"); }); }
Kode sebelumnya memungkinkan server menemukan dan melayani
index.html
file. File dilayani apakah pengguna memasukkan URL lengkapnya atau URL akar aplikasi web.Di akhir
Startup.Configure
, petakan rute /hub keChatHub
hub. Ganti kode yang menampilkan Halo Dunia! dengan baris berikut:app.UseEndpoints(endpoints => { endpoints.MapHub<ChatHub>("/hub"); });
Di
Startup.ConfigureServices
, panggil AddSignalR.services.AddSignalR();
Buat direktori baru bernama Hubs di WebPack akar SignalRproyek/ untuk menyimpan SignalR hub.
Buat hub
Hubs/ChatHub.cs
dengan kode berikut:using Microsoft.AspNetCore.SignalR; using System.Threading.Tasks; namespace SignalRWebPack.Hubs { public class ChatHub : Hub { } }
Tambahkan pernyataan berikut
using
di bagianStartup.cs
atas file untuk mengatasiChatHub
referensi:using SignalRWebPack.Hubs;
Mengaktifkan komunikasi klien dan server
Aplikasi saat ini menampilkan formulir dasar untuk mengirim pesan, tetapi belum berfungsi. Server mendengarkan rute tertentu tetapi tidak melakukan apa pun dengan pesan terkirim.
Jalankan perintah berikut di akar proyek:
npm i @microsoft/signalr @types/node
Perintah sebelumnya menginstal:
- Klien SignalR TypeScript, yang memungkinkan klien mengirim pesan ke server.
- Definisi jenis TypeScript untuk Node.js, yang memungkinkan pemeriksaan waktu kompilasi jenis Node.js.
Tambahkan kode yang disorot ke
src/index.ts
file:import "./css/main.css"; import * as signalR from "@microsoft/signalr"; const divMessages: HTMLDivElement = document.querySelector("#divMessages"); const tbMessage: HTMLInputElement = document.querySelector("#tbMessage"); const btnSend: HTMLButtonElement = document.querySelector("#btnSend"); const username = new Date().getTime(); const connection = new signalR.HubConnectionBuilder() .withUrl("/hub") .build(); connection.on("messageReceived", (username: string, message: string) => { let m = document.createElement("div"); m.innerHTML = `<div class="message-author">${username}</div><div>${message}</div>`; divMessages.appendChild(m); divMessages.scrollTop = divMessages.scrollHeight; }); connection.start().catch(err => document.write(err)); tbMessage.addEventListener("keyup", (e: KeyboardEvent) => { if (e.key === "Enter") { send(); } }); btnSend.addEventListener("click", send); function send() { }
Kode sebelumnya mendukung penerimaan pesan dari server. Kelas
HubConnectionBuilder
membuat penyusun baru untuk mengonfigurasi koneksi server. Fungsi iniwithUrl
mengonfigurasi URL hub.SignalR memungkinkan pertukaran pesan antara klien dan server. Setiap pesan memiliki nama tertentu. Misalnya, pesan dengan nama
messageReceived
dapat menjalankan logika yang bertanggung jawab untuk menampilkan pesan baru di zona pesan. Mendengarkan pesan tertentu dapat dilakukan melaluion
fungsi . Sejumlah nama pesan dapat didengarkan. Dimungkinkan juga untuk meneruskan parameter ke pesan, seperti nama penulis dan konten pesan yang diterima. Setelah klien menerima pesan, elemen barudiv
dibuat dengan nama penulis dan konten pesan dalam atributnyainnerHTML
. Ini ditambahkan ke elemen utamadiv
yang menampilkan pesan.Sekarang setelah klien dapat menerima pesan, konfigurasikan untuk mengirim pesan. Tambahkan kode yang disorot ke
src/index.ts
file:import "./css/main.css"; import * as signalR from "@microsoft/signalr"; const divMessages: HTMLDivElement = document.querySelector("#divMessages"); const tbMessage: HTMLInputElement = document.querySelector("#tbMessage"); const btnSend: HTMLButtonElement = document.querySelector("#btnSend"); const username = new Date().getTime(); const connection = new signalR.HubConnectionBuilder() .withUrl("/hub") .build(); connection.on("messageReceived", (username: string, message: string) => { let messages = document.createElement("div"); messages.innerHTML = `<div class="message-author">${username}</div><div>${message}</div>`; divMessages.appendChild(messages); divMessages.scrollTop = divMessages.scrollHeight; }); connection.start().catch(err => document.write(err)); tbMessage.addEventListener("keyup", (e: KeyboardEvent) => { if (e.key === "Enter") { send(); } }); btnSend.addEventListener("click", send); function send() { connection.send("newMessage", username, tbMessage.value) .then(() => tbMessage.value = ""); }
Mengirim pesan melalui koneksi WebSockets memerlukan panggilan
send
metode . Parameter pertama metode adalah nama pesan. Data pesan menghuni parameter lain. Dalam contoh ini, pesan yang diidentifikasi sebagainewMessage
dikirim ke server. Pesan terdiri dari nama pengguna dan input pengguna dari kotak teks. Jika pengiriman berfungsi, nilai kotak teks dikosongkan.Tambahkan metode
NewMessage
ke kelasChatHub
:using Microsoft.AspNetCore.SignalR; using System.Threading.Tasks; namespace SignalRWebPack.Hubs { public class ChatHub : Hub { public async Task NewMessage(long username, string message) { await Clients.All.SendAsync("messageReceived", username, message); } } }
Kode sebelumnya menyiarkan pesan yang diterima ke semua pengguna yang terhubung setelah server menerimanya. Tidak perlu memiliki metode generik
on
untuk menerima semua pesan. Metode yang dinamai sesuai dengan nama pesan sudah cukup.Dalam contoh ini, klien TypeScript mengirim pesan yang diidentifikasi sebagai
newMessage
. Metode C#NewMessage
mengharapkan data yang dikirim oleh klien. Panggilan dilakukan pada SendAsyncClients.All. Pesan yang diterima dikirim ke semua klien yang terhubung ke hub.
Menguji aplikasi
Konfirmasikan bahwa aplikasi berfungsi dengan langkah-langkah berikut.
Jalankan Webpack dalam mode rilis . Menggunakan jendela Konsol Manajer Paket, jalankan perintah berikut di akar proyek. Jika Anda tidak berada di akar proyek, masukkan
cd SignalRWebPack
sebelum memasukkan perintah .npm run release
Perintah ini menghasilkan aset sisi klien yang akan dilayani saat menjalankan aplikasi. Aset ditempatkan di
wwwroot
folder .Webpack menyelesaikan tugas-tugas berikut:
- Menghapus menyeluruh konten
wwwroot
direktori. - Mengonversi TypeScript ke JavaScript dalam proses yang dikenal sebagai terjemahan.
- Mangled JavaScript yang dihasilkan untuk mengurangi ukuran file dalam proses yang dikenal sebagai minifikasi.
- Menyalin file JavaScript, CSS, dan HTML yang diproses dari
src
kewwwroot
direktori. - Menyuntikkan elemen berikut ke
wwwroot/index.html
dalam file:- Tag
<link>
, mereferensikanwwwroot/main.<hash>.css
file. Tag ini ditempatkan segera sebelum tag penutup</head>
. - Tag
<script>
, merujuk pada file yang dikurangiwwwroot/main.<hash>.js
. Tag ini ditempatkan segera setelah tag penutup</title>
.
- Tag
- Menghapus menyeluruh konten
Pilih Debug>Mulai tanpa penelusuran kesalahan untuk meluncurkan aplikasi di browser tanpa melampirkan debugger. File
wwwroot/index.html
disajikan dihttp://localhost:<port_number>
.Jika Anda mendapatkan kesalahan kompilasi, coba tutup dan buka kembali solusinya.
Buka instans browser lain (browser apa pun). Tempelkan URL di bilah alamat.
Pilih salah satu browser, ketik sesuatu di kotak teks Pesan , dan pilih tombol Kirim . Nama pengguna dan pesan unik ditampilkan di kedua halaman secara instan.
Sumber Daya Tambahan:
Tutorial ini menunjukkan penggunaan Webpack di aplikasi web ASP.NET Core SignalR untuk memaketkan dan membangun klien yang ditulis dalam TypeScript. Webpack memungkinkan pengembang untuk memaketkan dan membangun sumber daya sisi klien dari aplikasi web.
Dalam tutorial ini, Anda akan mempelajari cara:
- Perancah aplikasi starter ASP.NET Core SignalR
- SignalR Mengonfigurasi klien TypeScript
- Mengonfigurasi alur build menggunakan Webpack
- SignalR Mengonfigurasi server
- Mengaktifkan komunikasi antara klien dan server
Melihat atau mengunduh kode sampel (cara mengunduh)
Prasyarat
- Visual Studio 2019 dengan beban kerja pengembangan ASP.NET dan web
- .NET Core SDK 2.2 atau yang lebih baru
- Node.js dengan npm
Membuat aplikasi web ASP.NET Core
Konfigurasikan Visual Studio untuk mencari npm dalam variabel lingkungan PATH . Secara default, Visual Studio menggunakan versi npm yang ditemukan di direktori penginstalannya. Ikuti petunjuk berikut di Visual Studio:
Navigasi ke Opsi>Alat>Proyek dan Solusi>Manajemen>Paket Web Alat Web Eksternal.
Pilih entri $(PATH) dari daftar. Pilih panah atas untuk memindahkan entri ke posisi kedua dalam daftar.
Konfigurasi Visual Studio selesai. Saatnya membuat proyek.
- Gunakan opsi menu Proyek Baru>File>dan pilih templat Aplikasi Web inti ASP.NET.
- Beri nama proyek *SignalRWebPack', dan pilih Buat.
- Pilih .NET Core dari drop-down kerangka kerja target, dan pilih ASP.NET Core 2.2 dari menu drop-down pemilih kerangka kerja. Pilih Templat kosong, dan pilih Buat.
Mengonfigurasi Webpack dan TypeScript
Langkah-langkah berikut mengonfigurasi konversi TypeScript ke JavaScript dan bundling sumber daya sisi klien.
Jalankan perintah berikut di akar proyek untuk membuat
package.json
file:npm init -y
Tambahkan properti yang disorot ke
package.json
file:{ "name": "SignalRWebPack", "version": "1.0.0", "private": true, "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" }
private
Mengatur properti untuktrue
mencegah peringatan penginstalan paket di langkah berikutnya.Instal paket npm yang diperlukan. Jalankan perintah berikut dari akar proyek:
npm install -D -E clean-webpack-plugin@1.0.1 css-loader@2.1.0 html-webpack-plugin@4.0.0-beta.5 mini-css-extract-plugin@0.5.0 ts-loader@5.3.3 typescript@3.3.3 webpack@4.29.3 webpack-cli@3.2.3
Beberapa detail perintah yang perlu diperhatikan:
- Nomor versi mengikuti
@
tanda untuk setiap nama paket. npm menginstal versi paket tertentu tersebut. - Opsi ini
-E
menonaktifkan perilaku default npm menulis operator rentang penerapan versi semantik ke *paketjson
. Misalnya,"webpack": "4.29.3"
digunakan alih-alih"webpack": "^4.29.3"
. Opsi ini mencegah peningkatan yang tidak diinginkan ke versi paket yang lebih baru.
Lihat dokumen npm-install untuk detail selengkapnya.
- Nomor versi mengikuti
scripts
Ganti propertipackage.json
file dengan kode berikut:"scripts": { "build": "webpack --mode=development --watch", "release": "webpack --mode=production", "publish": "npm run release && dotnet publish -c Release" },
Beberapa penjelasan tentang skrip:
build
: Menggabungkan sumber daya sisi klien dalam mode pengembangan dan mengawasi perubahan file. Pengamat file menyebabkan bundel diregenerasi setiap kali file proyek berubah. Opsi inimode
menonaktifkan pengoptimalan produksi, seperti pemecahan pohon dan minifikasi. Hanya digunakanbuild
dalam pengembangan.release
: Menggabungkan sumber daya sisi klien dalam mode produksi.publish
: Menjalankanrelease
skrip untuk menggabungkan sumber daya sisi klien dalam mode produksi. Ini memanggil perintah publikasi .NET Core CLI untuk menerbitkan aplikasi.
Buat file bernama
*webpack.config.js
di akar proyek, dengan kode berikut:const path = require("path"); const HtmlWebpackPlugin = require("html-webpack-plugin"); const CleanWebpackPlugin = require("clean-webpack-plugin"); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); module.exports = { entry: "./src/index.ts", output: { path: path.resolve(__dirname, "wwwroot"), filename: "[name].[chunkhash].js", publicPath: "/" }, resolve: { extensions: [".js", ".ts"] }, module: { rules: [ { test: /\.ts$/, use: "ts-loader" }, { test: /\.css$/, use: [MiniCssExtractPlugin.loader, "css-loader"] } ] }, plugins: [ new CleanWebpackPlugin(["wwwroot/*"]), new HtmlWebpackPlugin({ template: "./src/index.html" }), new MiniCssExtractPlugin({ filename: "css/[name].[chunkhash].css" }) ] };
File sebelumnya mengonfigurasi kompilasi Webpack. Beberapa detail konfigurasi yang perlu diperhatikan:
- Properti
output
mengambil alih nilaidist
default . Bundel malah dipancarkan dalamwwwroot
direktori. - Array
resolve.extensions
termasuk.js
untuk mengimpor SignalR JavaScript klien.
- Properti
Buat direktori src baru di akar proyek untuk menyimpan aset sisi klien proyek.
Buat
src/index.html
dengan markup berikut.<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>ASP.NET Core SignalR</title> </head> <body> <div id="divMessages" class="messages"> </div> <div class="input-zone"> <label id="lblMessage" for="tbMessage">Message:</label> <input id="tbMessage" class="input-zone-input" type="text" /> <button id="btnSend">Send</button> </div> </body> </html>
HTML sebelumnya mendefinisikan markup boilerplate beranda.
Buat direktori src/css baru. Tujuannya adalah untuk menyimpan file proyek
.css
.Buat
src/css/main.css
dengan markup berikut:*, *::before, *::after { box-sizing: border-box; } html, body { margin: 0; padding: 0; } .input-zone { align-items: center; display: flex; flex-direction: row; margin: 10px; } .input-zone-input { flex: 1; margin-right: 10px; } .message-author { font-weight: bold; } .messages { border: 1px solid #000; margin: 10px; max-height: 300px; min-height: 300px; overflow-y: auto; padding: 5px; }
File sebelumnya menata
main.css
aplikasi.Buat
src/tsconfig.json
dengan ON berikut JS:{ "compilerOptions": { "target": "es5" } }
Kode sebelumnya mengonfigurasi pengkompilasi TypeScript untuk menghasilkan JavaScript yang kompatibel dengan ECMAScript 5.
Buat
src/index.ts
dengan kode berikut:import "./css/main.css"; const divMessages: HTMLDivElement = document.querySelector("#divMessages"); const tbMessage: HTMLInputElement = document.querySelector("#tbMessage"); const btnSend: HTMLButtonElement = document.querySelector("#btnSend"); const username = new Date().getTime(); tbMessage.addEventListener("keyup", (e: KeyboardEvent) => { if (e.keyCode === 13) { send(); } }); btnSend.addEventListener("click", send); function send() { }
TypeScript sebelumnya mengambil referensi ke elemen DOM dan melampirkan dua penanganan aktivitas:
keyup
: Kejadian ini diaktifkan saat pengguna mengetik ditbMessage
kotak teks. Fungsisend
ini dipanggil ketika pengguna menekan tombol Enter .click
: Kejadian ini diaktifkan saat pengguna memilih tombol Kirim . Fungsisend
ini dipanggil.
Mengonfigurasi aplikasi ASP.NET Core
Kode yang disediakan dalam
Startup.Configure
metode menampilkan Halo Dunia!.app.Run
Ganti panggilan metode dengan panggilan ke UseDefaultFiles(IApplicationBuilder) dan UseStaticFiles(IApplicationBuilder).app.UseDefaultFiles(); app.UseStaticFiles();
Kode sebelumnya memungkinkan server menemukan dan melayani
index.html
file, baik pengguna memasukkan URL lengkapnya atau URL akar aplikasi web.Panggil AddSignalR di
Startup.ConfigureServices
. Ini menambahkan SignalR layanan ke proyek.services.AddSignalR();
Petakan rute /hub ke
ChatHub
hub. Tambahkan baris berikut di akhirStartup.Configure
:app.UseSignalR(options => { options.MapHub<ChatHub>("/hub"); });
Buat direktori baru, yang disebut Hubs, di akar proyek. Tujuannya adalah untuk menyimpan SignalR hub, yang dibuat pada langkah berikutnya.
Buat hub
Hubs/ChatHub.cs
dengan kode berikut:using Microsoft.AspNetCore.SignalR; using System.Threading.Tasks; namespace SignalRWebPack.Hubs { public class ChatHub : Hub { } }
Tambahkan kode berikut di bagian
Startup.cs
atas file untuk mengatasiChatHub
referensi:using SignalRWebPack.Hubs;
Mengaktifkan komunikasi klien dan server
Aplikasi saat ini menampilkan formulir sederhana untuk mengirim pesan. Tidak ada yang terjadi ketika Anda mencoba untuk melakukannya. Server mendengarkan rute tertentu tetapi tidak melakukan apa pun dengan pesan terkirim.
Jalankan perintah berikut di akar proyek:
npm install @aspnet/signalr
Perintah sebelumnya menginstal SignalR klien TypeScript, yang memungkinkan klien mengirim pesan ke server.
Tambahkan kode yang disorot ke
src/index.ts
file:import "./css/main.css"; import * as signalR from "@aspnet/signalr"; const divMessages: HTMLDivElement = document.querySelector("#divMessages"); const tbMessage: HTMLInputElement = document.querySelector("#tbMessage"); const btnSend: HTMLButtonElement = document.querySelector("#btnSend"); const username = new Date().getTime(); const connection = new signalR.HubConnectionBuilder() .withUrl("/hub") .build(); connection.on("messageReceived", (username: string, message: string) => { let m = document.createElement("div"); m.innerHTML = `<div class="message-author">${username}</div><div>${message}</div>`; divMessages.appendChild(m); divMessages.scrollTop = divMessages.scrollHeight; }); connection.start().catch(err => document.write(err)); tbMessage.addEventListener("keyup", (e: KeyboardEvent) => { if (e.keyCode === 13) { send(); } }); btnSend.addEventListener("click", send); function send() { }
Kode sebelumnya mendukung penerimaan pesan dari server. Kelas
HubConnectionBuilder
membuat penyusun baru untuk mengonfigurasi koneksi server. Fungsi iniwithUrl
mengonfigurasi URL hub.SignalR memungkinkan pertukaran pesan antara klien dan server. Setiap pesan memiliki nama tertentu. Misalnya, pesan dengan nama
messageReceived
dapat menjalankan logika yang bertanggung jawab untuk menampilkan pesan baru di zona pesan. Mendengarkan pesan tertentu dapat dilakukan melaluion
fungsi . Anda dapat mendengarkan sejumlah nama pesan. Dimungkinkan juga untuk meneruskan parameter ke pesan, seperti nama penulis dan konten pesan yang diterima. Setelah klien menerima pesan, elemen barudiv
dibuat dengan nama penulis dan konten pesan dalam atributnyainnerHTML
. Pesan baru ditambahkan ke elemen utamadiv
yang menampilkan pesan.Sekarang setelah klien dapat menerima pesan, konfigurasikan untuk mengirim pesan. Tambahkan kode yang disorot ke
src/index.ts
file:import "./css/main.css"; import * as signalR from "@aspnet/signalr"; const divMessages: HTMLDivElement = document.querySelector("#divMessages"); const tbMessage: HTMLInputElement = document.querySelector("#tbMessage"); const btnSend: HTMLButtonElement = document.querySelector("#btnSend"); const username = new Date().getTime(); const connection = new signalR.HubConnectionBuilder() .withUrl("/hub") .build(); connection.on("messageReceived", (username: string, message: string) => { let messageContainer = document.createElement("div"); messageContainer.innerHTML = `<div class="message-author">${username}</div><div>${message}</div>`; divMessages.appendChild(messageContainer); divMessages.scrollTop = divMessages.scrollHeight; }); connection.start().catch(err => document.write(err)); tbMessage.addEventListener("keyup", (e: KeyboardEvent) => { if (e.keyCode === 13) { send(); } }); btnSend.addEventListener("click", send); function send() { connection.send("newMessage", username, tbMessage.value) .then(() => tbMessage.value = ""); }
Mengirim pesan melalui koneksi WebSockets memerlukan panggilan
send
metode . Parameter pertama metode adalah nama pesan. Data pesan menghuni parameter lain. Dalam contoh ini, pesan yang diidentifikasi sebagainewMessage
dikirim ke server. Pesan terdiri dari nama pengguna dan input pengguna dari kotak teks. Jika pengiriman berfungsi, nilai kotak teks dikosongkan.Tambahkan metode
NewMessage
ke kelasChatHub
:using Microsoft.AspNetCore.SignalR; using System.Threading.Tasks; namespace SignalRWebPack.Hubs { public class ChatHub : Hub { public async Task NewMessage(long username, string message) { await Clients.All.SendAsync("messageReceived", username, message); } } }
Kode sebelumnya menyiarkan pesan yang diterima ke semua pengguna yang terhubung setelah server menerimanya. Tidak perlu memiliki metode generik
on
untuk menerima semua pesan. Metode yang dinamai sesuai dengan nama pesan sudah cukup.Dalam contoh ini, klien TypeScript mengirim pesan yang diidentifikasi sebagai
newMessage
. Metode C#NewMessage
mengharapkan data yang dikirim oleh klien. Panggilan dilakukan pada SendAsyncClients.All. Pesan yang diterima dikirim ke semua klien yang terhubung ke hub.
Menguji aplikasi
Konfirmasikan bahwa aplikasi berfungsi dengan langkah-langkah berikut.
Jalankan Webpack dalam mode rilis . Menggunakan jendela Konsol Manajer Paket, jalankan perintah berikut di akar proyek. Jika Anda tidak berada di akar proyek, masukkan
cd SignalRWebPack
sebelum memasukkan perintah .npm run release
Perintah ini menghasilkan aset sisi klien yang akan dilayani saat menjalankan aplikasi. Aset ditempatkan di
wwwroot
folder .Webpack menyelesaikan tugas-tugas berikut:
- Menghapus menyeluruh konten
wwwroot
direktori. - Mengonversi TypeScript ke JavaScript dalam proses yang dikenal sebagai terjemahan.
- Mangled JavaScript yang dihasilkan untuk mengurangi ukuran file dalam proses yang dikenal sebagai minifikasi.
- Menyalin file JavaScript, CSS, dan HTML yang diproses dari
src
kewwwroot
direktori. - Menyuntikkan elemen berikut ke
wwwroot/index.html
dalam file:- Tag
<link>
, mereferensikanwwwroot/main.<hash>.css
file. Tag ini ditempatkan segera sebelum tag penutup</head>
. - Tag
<script>
, merujuk pada file yang dikurangiwwwroot/main.<hash>.js
. Tag ini ditempatkan segera setelah tag penutup</title>
.
- Tag
- Menghapus menyeluruh konten
Pilih Debug>Mulai tanpa penelusuran kesalahan untuk meluncurkan aplikasi di browser tanpa melampirkan debugger. File
wwwroot/index.html
disajikan dihttp://localhost:<port_number>
.Buka instans browser lain (browser apa pun). Tempelkan URL di bilah alamat.
Pilih salah satu browser, ketik sesuatu di kotak teks Pesan , dan pilih tombol Kirim . Nama pengguna dan pesan unik ditampilkan di kedua halaman secara instan.
Sumber Daya Tambahan:
ASP.NET Core
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk