MS_ESProj - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki
- æ»ãïŒASP.NET SPAãASP.NET CoreïŒ
- Web Essentials
- ASP.NET Core SPAãã³ãã¬ãŒã
- .esprojïŒJavaScriptã»TypeScriptãããžã§ã¯ãã·ã¹ãã ïŒ
- Visual Studio 2022 ããæ¬æ Œå°å
¥ããããã¢ãã³ãª SPA éçºã C# ã®äžçïŒMSBuildïŒãš
ã¹ããŒãã«èåãããããã®æ°ãããããžã§ã¯ãåœ¢åŒ - åŸæ¥ã®ããã«ã.csproj ã®äžã«ç¡çãã JavaScript ã®ãã¡ã€ã«ãè©°ã蟌ããã®ã§ã¯ãªãã
ããã³ããšã³ããç¬ç«ããŠæ±ãããã«äœãããã
è£è¶³ïŒäœããæ°ãããã®ãïŒ: äžé£ã® SPA ãã³ãã¬ãŒãã®æŽå²
ïŒASP.NET Core SPAãã³ãã¬ãŒãã
JavaScript ServicesïŒã®å°éç¹ã
.esprojã§ããããšäœçœ®ä»ãããšåããããããã第 1 äžä»£ïŒ2017ïŒã JavaScript Services 1 ã€ã® .csproj ã« ClientApp ãã©ã«ããåå± ããã .NET ã webpack ãèµ·åããNode.js ãåããã»ã¹ã§æ±ãã â ã.NET ãããã³ãã®é¢åãèŠãã â 廿¢ããã â ã第 2 äžä»£ïŒ2020 é ïŒã æäœæ¥ã§ã®åé¢ ããã³ããå¥ãã©ã«ãïŒå¥ãªããžããªã«ãã ããããå¥ã«èµ·åãå¥ã«ãã«ã â æ£ããããIDE ã®æ¯æŽããªããïŒVS ã®æ©æµãèãïŒ ã第 3 äžä»£ïŒVS2022ïŒã .esproj ããã³ãããç¬ç«ãããããžã§ã¯ãããšããŠæ±ã ãã ãããœãªã¥ãŒã·ã§ã³ã«ã¯èŒãã â åé¢ãã€ã€ãIDE ã®çµ±åïŒF5 ã§äž¡æ¹èµ·åïŒã¯ä¿ã€ âãåé¢ããããçµ±åãããäœéšã¯è«Šããªããââ
ããã.esprojã®èšèšææ³ã§ããã
...VSCode 䜿ãã°è¯ãã®ã§ã¯ïŒ...
è£è¶³ïŒåæã®ãã®äžèšãžã®åçïŒ: ãVS Code 䜿ãã°è¯ãã®ã§ã¯ïŒã
ãšããççŽãªçåã¯ãå®åçã«ã¯ããªãçãå°ãŠããã
å ¬å¹³ã«æŽçããŠããã
èŠ³ç¹ VS + .esproj VS CodeïŒ2 ã€éã / 1 ã€ã§äž¡æ¹ïŒ C# ã®ããã㰠匷åïŒVS ã®æ¬é ïŒ å¯èœïŒC# Dev KitïŒãVS ã«ã¯åã°ãªã ããã³ãã®ç·šéäœéš æ®é å¿«é©ïŒæ¡åŒµãè±å¯ãåäœã軜ãïŒ èµ·åïŒF5ïŒ 1 ãã¿ã³ã§äž¡æ¹ â launch.jsonã® compound ã§åçã«ã§ããCI ãšã®äžè²«æ§ MSBuild ã«ä¹ã npm scripts ã§æç€ºçã«æžã ããŒã ã®åæ¥ ããã³ãæ åœã VS ãèŠã ããã³ãæ åœã¯ VS Code ã ãã§ãã â ã©ã€ã»ã³ã¹ VS ã®ã©ã€ã»ã³ã¹ãèŠã ç¡å åäœã®è»œã éã 軜ã ã.esproj ãåãå Žé¢ã ã»C# éçºè ããããã³ããèªåã§æžããå°ïœäžèŠæš¡ããŒã ã»ãã§ã« VS ã©ã€ã»ã³ã¹ããããCI ã MSBuild äžå¿ ã»ãF5 äžçºãã®äœéšãéèŠãã ãVS CodeïŒåé¢ïŒãåãå Žé¢ã ã»ããã³ãå°ä»»ãããïŒãã®äººã« VS ãè²·ãçç±ããªãïŒâ ã»ããã³ããå¥ãªããžããªã»å¥ãããã€ã«ãã ã»Mac / Linux ã®éçºè ããã ã»ããã³ãã®ãã«ãã CI ã§ç¬ç«ããããåæã®çåã劥åœãªã®ã¯ãã.esproj ã§ãªããã°ã§ããªãããšãã
ã»ãšãã©ãªãããã§ããã
.esprojãæäŸããã®ã¯å©äŸ¿æ§ã§ãã£ãŠãæ©èœã§ã¯ãªãããã ãããCI/CD ãäžæ¬åã§ãããç¹ã¯å®è³ªçãªå©ç¹ã§ãã
ïŒåŸè¿°ã®ãã©ããªäººã«åããŠããïŒãïŒã
VS 㯠VSC ãšåæ§ã«ãçã® npmãnpxããŸã㯠yarnãpnpm ãªã©ã® CLI ããŒã«ã
ããã¯ã°ã©ãŠã³ãã§çŽæ¥åŒã³åºãã
è£è¶³ïŒãã®ç¹ãæãéèŠïŒ:
.esprojã¯ç¬èªã®ãã«ãæ©æ§ãæããªãââ
ããã Web Essentials ã®å€±æïŒïŒ IDE äŸåã®ã³ã³ãã€ã©ïŒãã
åŠãã ç¹ã§ããããWeb EssentialsïŒ2010ïœ2015ïŒã VS ã®æ¡åŒµæ©èœããèªåã§ãLESS/Sass/TS ãã³ã³ãã€ã«ããŠãã â VS ããªããšãã«ãã§ããªã â ã.esprojïŒ2022ïœïŒã VS ã¯ãnpm run build ãåŒã¶ã ããâ â package.json ããããã°ãVS ããªããŠããã«ãã§ãã â CI ã§ããVS Code ã§ããã³ãã³ãã©ã€ã³ã§ãåãçµæã€ãŸãã
.esprojãå ¥ããŠã
ãVS ããªããšãã«ãã§ããªããç¶æ ã«ã¯ãªããªãã
ããã¯æ¡çšå€æã«ãããŠéèŠãªæ§è³ªã§ããã# .esproj ã®ãããžã§ã¯ãããããã§æ®éã«ãã«ãã§ãã cd myapp.client npm ci npm run build
.esproj ã®å°å
¥ã«ãããVisual Studio ã§ã® Web éçºã¯ä»¥äžã®ããã«åçã«å€å
-
ãã«ã
- ...ãéãïŒC# ããã«ããããã³ã« npm run build ãèµ°ããæéããããã
- ...ã®åé¢ïŒãããã°æã¯ Vite çã®é«é㪠HMRïŒHot Module ReplacementïŒã䜿ãã
C# åŽã¯ API ã®ã³ã³ãã€ã«ã ãã«å°å¿µã
-
PJ äŸåé¢ä¿
- ...ããã¡ãæ··ãïŒNuGet ããã±ãŒãžãš npm ããã±ãŒãžã®ç®¡çã 1 ã€ã®å Žæã§æ··ããã
- ...ã®å®å
šåé¢ïŒããã¯ãšã³ã㯠.csprojïŒNuGetïŒã
ããã³ããšã³ã㯠.esprojïŒnpmïŒãšå®å šã«åãããã
-
ãããã°ã®
- ...éå§ãé¢åïŒAPI ãš SPA ãäž¡æ¹ç«ã¡äžããããã«ã
æåã§ã¿ãŒããã«ã 2 ã€éãå¿ èŠããã£ãã - ...ãã«ãã¹ã¿ãŒãã¢ããïŒVS ã®ãéå§ããã¿ã³ 1 ã€ã§ã
API ã®èµ·åãš SPA ã®éçºãµãŒããŒïŒVite çïŒã®èµ·åããã©ãŠã¶èµ·åãŸã§èªååã
- ...éå§ãé¢åïŒAPI ãš SPA ãäž¡æ¹ç«ã¡äžããããã«ã
è£è¶³ïŒ3 ã€ã®èª²é¡ã®èæ¯ïŒ: ãããããæ§ãã³ãã¬ãŒãã§å®éã«
èµ·ããŠããåé¡ã§ãããâ ãã«ããéã
ãæ§ïŒ1 ãããžã§ã¯ãïŒã dotnet build â MSBuild ã®ã¿ãŒã²ããã§ npm run build ãèµ·å â webpack ãå šéšãã³ãã«ïŒæ°åç§ïŒ â C# ã 1 è¡çŽãã ãã§ããããã³ããäžžããšåãã«ãããã â ãæ°ïŒ.esprojïŒã Debug æ§æã§ã¯ ShouldRunBuildScript = false â npm run build ããèµ°ãããªãã â 代ããã« Vite ã® dev server ã HMR ã§å·®åæŽæ°â¡ äŸåé¢ä¿ã®ãã¡ãæ··ã
ãæ§ã 1 ã€ã®ãã©ã«ãã« MyApp.csprojïŒNuGet ã®åç §ïŒ package.jsonïŒnpm ã®äŸåïŒ node_modules/ïŒæ°äžãã¡ã€ã«ïŒâ ã»node_modules ã .csproj ã®ãã¡ã€ã«åæã«åŒã£ããã â VS ãé ããªãããã«ã察象ã«çŽã蟌ã ã».gitignore ã®ç®¡çãç ©é ã»ããã®ãããžã§ã¯ãã®äŸåã¯äœãããäžç®ã§åãããªã⢠ãããã°éå§ãé¢å
ãæ§ïŒæååé¢ããå ŽåïŒã ã¿ãŒããã«1ïŒ dotnet run ã¿ãŒããã«2ïŒ npm run dev ãã©ãŠã¶ïŒ æã§éã â æ¯åãã®æé ãæ°ã¡ã³ããŒãžã®èª¬æãèŠã ãæ°ã F5 äžçºãªããâ¡ã®ãå®å šåé¢ãã¯çŸåšã®èšèšãšããŠæ£ãããã
node_modulesã®éãã¯æ¶ããŠããªãç¹ã«æ³šæãããã»node_modules ã¯äŸç¶ãšããŠå·šå€§ïŒæ°çŸ MBãæ°äžãã¡ã€ã«ïŒ ã»ãŠã€ã«ã¹å¯Ÿçãœããã®é€å€èšå®ãæšå¥š â [ãŠã€ã«ã¹ã¹ãã£ã³] åç § ã»CI ã§ã¯ npm ciïŒãã£ãã·ã¥å©çšïŒã§æéãæãã ã»pnpm ã䜿ããšããã£ã¹ã¯äœ¿çšéãåçã«æžããïŒããŒããªã³ã¯æ¹åŒïŒâ
.esproj ãã¡ã€ã«ã®å®äœã¯ãC# ã® .csproj ãªã©ãšåã XML 圢åŒïŒMSBuild 圢åŒïŒã®ãã¡ã€ã«ã§ã
äž»ã«ãJavaScript ããŒã«ãã§ãŒã³ãš MSBuild ãçµã³ã€ããèšå®ãã ããæžãããã
<Project Sdk="Microsoft.VisualStudio.JavaScript.Sdk/1.0.0-alpha.x.x">
<PropertyGroup>
<StartupCommand>npm run dev</StartupCommand>
<JavaScriptTestRoot>src\</JavaScriptTestRoot>
<JavaScriptTestFramework>Jest</JavaScriptTestFramework>
<SpawnServerScript >true</SpawnServerScript>
<BuildOutputFolder>$(MSBuildProjectDirectory)\dist</BuildOutputFolder>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)' == 'Debug'">
<ShouldRunBuildScript>false</ShouldRunBuildScript>
</PropertyGroup>
<ItemGroup>
<Folder Include="src\assets\" />
</ItemGroup>
</Project>- éèŠãª MSBuild ããããã£
- ShouldRunNpmInstall: trueïŒããã©ã«ãïŒã«ããŠãããšã
VS ã§ãœãªã¥ãŒã·ã§ã³ãéããæããã«ãæã«ãèªåã§ npm install ãå®è¡ - ShouldRunBuildScript: 補åãªãªãŒã¹çšïŒPublishïŒãã«ãã®éã
èªåã§ npm run build ãèµ°ãããææç©ãæå®ã®ãã©ã«ãã«åºå
- ShouldRunNpmInstall: trueïŒããã©ã«ãïŒã«ããŠãããšã
è£è¶³ïŒåããããã£ã®æå³ãšãå®åã§ã®æ³šæïŒ:
ãããã㣠æå³ SdkJavaScript ãããžã§ã¯ã SDKã .csprojã®Microsoft.NET.Sdkã«çžåœStartupCommandF5 ã§å®è¡ãããã³ãã³ãïŒ npm run devçïŒJavaScriptTestRootãã¹ãã®æ¢çŽ¢å¯Ÿè±¡ãã©ã«ã JavaScriptTestFrameworkãã¹ã ãšã¯ã¹ãããŒã©ãŒãšã®çµ±åïŒJest / Vitest / MochaïŒ SpawnServerScriptéçºãµãŒããŒãå¥ããã»ã¹ã§èµ·åããã BuildOutputFolderãã«ãææç©ã®åºåå ïŒ distïŒShouldRunNpmInstallãœãªã¥ãŒã·ã§ã³ãéããéã« npm installãèªåå®è¡ShouldRunBuildScriptãã«ãæã« npm run buildãå®è¡ããã â
ShouldRunNpmInstallã«ã¯æ³šæç¹ãããããåé¡ã ã»èªåã§ npm install ãèµ°ãïŒãpackage-lock.json ãæŽæ°ããåŸãã â æå³ããªãäŸåã®çäžãã â ããŒã å ã§ lock ãã¡ã€ã«ã®å·®åãåºã â ã»ãªãã©ã€ã³ç°å¢ã§éããšå€±æãã ã»éããã³ã«æéããããïŒãã£ãã·ã¥ãããã°éããïŒ ã察çã ã»CI ã§ã¯ãnpm ciãã䜿ãïŒlock ãå³å¯ã«å®ããinstall ã§ã¯ãªãïŒ ã»æ°ã«ãªããªã ShouldRunNpmInstall ã false ã«ãã æå or CI ã§æç€ºçã«å®è¡ãã
Condition="'$(Configuration)' == 'Debug'"ã®æå³:Debug æ§æã®ãšãã ã ShouldRunBuildScript = false â ãããã°æã¯æ¬çªãã«ããèµ°ãããªãïŒVite ã® dev server ã䜿ãïŒ â Release / Publish ã®ãšã㯠true ã®ãŸãŸïŒ npm run build ãèµ°ã â ããã® 1 è¡ãããã«ããéããåé¡ã®è§£ãã§ãã â
1.0.0-alpha.x.xãšããããŒãžã§ã³:
åæãèšé²ããŠããéãã
ãã® SDK ã¯é·ãã alpha çãšããŠæäŸãããŠããã
çŸåšãããŒãžã§ã³ãæç€ºçã«ãã³çãããã®ãå®å šã§ãã
ïŒVS ã®æŽæ°ã§ SDK ã®æåãå€ããããšãããïŒã
-
.esproj ãã³ãã¬ãŒãïŒäŸïŒReact with ASP.NET CoreïŒãéžã¶ãšã
ããã³ããšã³ããšããã¯ãšã³ããã©ããã£ãŠéä¿¡ãããã®ä»æãïŒãããã·èšå®ïŒã
èªåã§æ§ç¯ãããã- SPA åŽïŒVite çïŒã®ããŒã: localhost:5173
- API åŽïŒC#ïŒã®ããŒã: localhost:7200
-
éçºäžãSPA åŽãã /api/weather ã®ããã«ãªã¯ãšã¹ããéããšã
Vite åŽã®éçºçšãããã·ïŒvite.config.ts ã«èªåèšè¿°ãããèšå®ïŒãã
è£åŽã§èªåçã« C# åŽã® localhost:7200/api/weather ãžãªã¯ãšã¹ãã転éã
CORS ãšã©ãŒã«æ©ãŸãããããšããªããªãã
è£è¶³ïŒèªåçæãããèšå®ã®äžèº«ïŒ: Visual Studio Codeã«ããSPAéçº
ã§ã察ç BïŒãããã·ïŒãåªããŠããããšè¿°ã¹ãæ§æãã
VS ãèªåã§äœã£ãŠãããââãšããã®ããã®ç¯ã®å 容ã§ããã// vite.config.tsïŒãã³ãã¬ãŒããçæãããã®ã®èŠç¹ïŒ export default defineConfig({ server: { proxy: { '^/api': { target: 'https://localhost:7200', secure: false, // éçºçšã®èªå·±çœ²åèšŒææžã蚱容 } }, port: 5173, } });ããªã¯ãšã¹ãã®æµãïŒéçºæïŒã ãã©ãŠã¶ â localhost:5173/api/weather â Vite ã® dev server ãåãã â /api ã§å§ãŸãã®ã§ã転éã ⌠localhost:7200/api/weatherïŒASP.NET CoreïŒ â ãã©ãŠã¶ããèŠããšãåäžãªãªãžã³ã â CORS ãçºçããªã â â Cookie èªèšŒããã®ãŸãŸå¹ãæ¬çªã§ã¯ãããã·ã¯ååšããªãç¹ã«æ³šæããã
ãæ¬çªã®æ§æïŒäŸïŒã â SPA ã ASP.NET Core ã® wwwroot ã«é 眮ããåäžãã¡ã€ã³ã§é ä¿¡ â MapFallbackToFile("index.html")ïŒ[Spa Services] åç §ïŒ â¡ SPA ã CDN / Static Web Apps ã«ãAPI ãå¥ãã¡ã€ã³ã« â ãCORS ã®èšå®ãå¿ èŠã«ãªãã ⢠ãªããŒã¹ ãããã·ïŒnginx / Azure Front DoorïŒã§ åäžãã¡ã€ã³ã«æãã â æšå¥šéçºæã« CORS ãèµ·ããªãæ§æã«ããŠãããšã
æ¬çªã§åã㊠CORS ã«åœããââãšããäºæ ãèµ·ããåŸãã
æ¬çªãšåãæ§æãã¹ããŒãžã³ã°ç°å¢ã§æ€èšŒããå¿ èŠããããèšŒææžã«ã€ããŠã®è£è¶³:
ã»ASP.NET Core ã¯éçºçšã®èªå·±çœ²åèšŒææžã䜿ã dotnet dev-certs https --trust ã»Vite åŽã¯ secure: false ã§æ€èšŒãã¹ããããã â ãéçºæã®ã¿ããæ¬çªã®èšå®ã«æã¡èŸŒãŸãªãããš
- Visual Studio 1 ã€ã§éçºãå®çµããããïŒ
ãC# ã®ãããã°ã¯ VSãããã³ããšã³ã㯠VS Codeããšç»é¢ãè¡ãæ¥ããã®ãé¢åã§ã
1 ã€ã® IDEã1 ã€ã®ããããã°éå§ïŒF5ïŒããã¿ã³ã§å šãŠãå¶åŸ¡ãããå Žåã«
æé«ã®ããã©ãŒãã³ã¹ãçºæ® - CI/CDïŒãã«ããã€ãã©ã€ã³ïŒãäžæ¬åãããïŒMSBuild ã®ä»çµã¿ã«ä¹ã£ãã£ãŠããããã
Azure Pipelines ã GitHub Actions ã§ããœãªã¥ãŒã·ã§ã³å šäœã®ãã«ãããå®è¡ããã ãã§ã
ããã³ããšã³ãã® npm install & build ãåŠçã§ããã
è£è¶³ïŒCI/CD ã®äžæ¬åã«ã€ããŠãå ¬å¹³ã«ïŒ: 2 çªç®ã®å©ç¹ã¯å®è³ªçã ãã
äžæ¬åãåžžã«è¯ããšã¯éããªãã®ã§ãäž¡é¢ãæžããŠããã# äžæ¬åããå ŽåïŒGitHub ActionsïŒ - run: dotnet publish -c Release # â .csproj ã®ãã«ã + .esproj çµç±ã§ npm ci && npm run build # â ã1 ã³ãã³ãã§æžããâ# åé¢ããå Žå - run: npm ci --prefix ./client - run: npm run build --prefix ./client - run: dotnet publish -c Release # â èšè¿°ã¯å¢ãããããäœãèµ·ããŠããããèŠããã
äžæ¬åïŒ.esprojïŒ åé¢ èšè¿°é å°ãªã å€ã 倱æç®æã®ç¹å® MSBuild ã®ãã°ã«åããã æç¢º â ãã£ãã·ã¥ npm ãã£ãã·ã¥ãå¹ããã«ãã actions/setup-nodeã®ãã£ãã·ã¥ãå¹ã â䞊åå ãã«ãã ããã³ããšããã¯ã䞊åãã«ãã§ãã éšåããã〠ãã«ãã ããã³ãã ãåãããã€ããå¯èœ å¿ èŠãªç°å¢ .NET SDK ã®ã¿ïŒNode 㯠SDK ãåŒã¶ïŒ .NET SDK + Node.js ãèŠæš¡ã«ãã䜿ãåãã å°ïœäžèŠæš¡ãããã³ããšããã¯ãåžžã«åæã«ãããã€ãã â ãäžæ¬åã§è¯ãã å€§èŠæš¡ãããã³ããšããã¯ã®ãªãªãŒã¹ ãµã€ã¯ã«ãéã â ãåé¢ããã â ããã³ã㯠CDNãããã¯ã¯ App Serviceããšé 眮å ãéã**倿ã®è»žã¯ãããã³ããšããã¯ãåžžã«åæã«ãããã€ãããã**ã§ããã
åæãªãäžæ¬åãå¥ã ãªãåé¢ââãšèãããšè¿·ãã«ããã
...
- Visual Studio ã§ã® JavaScript ãš TypeScript
https://learn.microsoft.com/ja-jp/visualstudio/javascript/ - Visual Studio ã§ã® JavaScript ãããžã§ã¯ãïŒ.esprojïŒ
https://learn.microsoft.com/ja-jp/visualstudio/javascript/javascript-project-system - Visual Studio ã§ã® React ãš ASP.NET Core
https://learn.microsoft.com/ja-jp/visualstudio/javascript/tutorial-asp-net-core-with-react - ASP.NET Core ã§ã® SPA ã®éçº
https://learn.microsoft.com/ja-jp/aspnet/core/client-side/spa/intro
Tags: ç§»è¡, .NETéçº, .NET Core, ASP.NET, ASP.NET Web API, ASP.NET SPA, JavaScript