ASP를 관리합니다.NET 핵심 MVC 전단 의존항과 npm 및 웹팩 (제1부분)

20836 단어 npmmvcwebpackaspnet
.NET6는 두 개의 훌륭한 프로젝트 템플릿을 제공하여 신속하게 시작하고 실행할 수 있습니다.그러나 MPA(다중 페이지 애플리케이션)은 많은 관심을 받지 못했다.소프트웨어 패키지는 이미 유행이 지났기 때문에 현대적인 방법으로 새로운 JS 라이브러리를 추가할 수 없다.
그러나 시작은 쉽다. web 템플릿을 선택하든지, 거의 비어 있는 항목을 선택하든지, mvc 또는 webapp 템플릿을 선택하든지, 더 많은 템플릿 파일을 선택하든지.
두 가지 모두 각자의 장점이 있다.
  • dotnet new web:거의
    아무것도 아니에요.하면, 만약, 만약...
    너는 이미 준비가 다 되었다
    긁다.
  • dotnet new mvc(또는 webapp): 메가파운드 하나 드릴게요.
    단번에
    시간이 지나 프로젝트와 함께 묶여
    이것은 결코 많은 변화의 공간을 제공하지 않았다.
    (webapp은 페이지 기반 프로젝트를 생성합니다.mvc 모델 뷰 컨트롤러 프로젝트 생성)
  • 원하는 방식으로 전단을 설정하는 것은 어려울 수 있습니다. 특히 angular 템플릿이나 react 템플릿에서 시작하지 않았을 때입니다.여러 페이지/보기와 관련된 일을 하고 싶거나, 제공하는 프레임워크가 아닌 SPA 프레임워크를 사용하고 싶더라도 (예: Vue 또는 Svelte!)그럼 이 안내서가 설치해 드릴게요!

    우리 뭐하지?
  • 은 ASP를 구축합니다.NET 핵심 MVC
    사용자 정의 전단 의존 항목이 있는 항목입니다.
    이것은 전문적으로 다루는 여러 페이지의 응용 프로그램이 될 것이다
    우리의 필요.더 구체적으로 말하면...
  • Bootstrap은
    프로젝트의 의존성
    항목의 일부.그래서 저희 프로젝트 트리가...
    더 이상
    JS와 지도 파일을 축소합니다.
  • 2014년처럼 JQuery 탈락!
    ASP에서만 참조됩니다.NET 형식
    it still depends on it부터 효력이 발생한다.
  • 은 종속성 및 구축 프로세스를 설정합니다.
    npm와 웹 패키지를 사용합니다.모든 JavaScript
    CSS 코드는
    이것은 구축 임무다.모든 .js.css파일은 별도의 src 디렉토리에 저장됩니다.오직
    구축 공작물은 wwwroot에서 끝난다.

  • 우리 왜 이러는지
    무엇보다 MVC 템플릿이 너무 확고하고 경직돼 있다는 점이 중요하다.프로젝트에 새로운 프런트엔드 라이브러리를 추가하는 것은 어려운 일이며, 이렇게 해서는 안 된다.
    프로젝트에 NuGet 패키지를 추가하면 프로젝트 트리에 많은 DLL이 생성되지 않습니다.전방에 라이브러리를 추가할 때, 이 두 가지 상황은 모두 발생해서는 안 된다.또한 NuGet 패키지와 같은 정확한 버전 번호를 사용하도록 제어하고자 합니다.
    이 과정에서 우리는 어떻게 수영 외에 웹 패키지를 사용하는지 더욱 잘 이해할 것이다!
    우리 시작합시다!

    프로젝트 만들기
    당신이 필요로 하는 것은:
  • A .NET 6 SDK.제5망과 제5망.NET Core 2와 3도 정상적으로 작동할 수 있다.저는 6.0.101을 사용했습니다. 이전에도 사용한 적이 있습니다.순수하다NET 커널, 이 설정에 사용됩니다.

  • NodeJS with bundled npm
    (또는 사선) 저는 16.14.0을 씁니다.
  • 옵션, IDE 1개.이제 너는 하나만
    기능 명령행!
  • 새로운 MVC 프로젝트를 만듭니다.새 빈 디렉토리로 이동하여 다음을 입력합니다.
    $ dotnet new mvc
    
    git를 사용한다면 .gitignore 파일을 계속 만듭니다.고맙게도 또 하나의 단독이 있다.NET 템플릿으로 이 문제를 처리합니다.프로젝트 디렉토리에 다음과 같이 입력할 수 있습니다.
    $ dotnet new gitignore
    
    다음과 같은 방법으로 프로젝트를 시작합니다.
    $ dotnet run
    
    항목 보기 포트 번호가 generated인 경우 출력 확인(또는 Properties/launchSettings.json)을 수행하고 localhost으로 이동합니다.
    이 시작 항목은 Gitlab에서 찾을 수 있으며 주소는 the first version/Net6NpmWebpack입니다.

    프런트엔드 종속성
    그런 다음 MVC 프로젝트의 루트 디렉토리에 ClientApp이라는 새 디렉토리를 만듭니다.이 새 디렉터리에 package.json이라는 파일을 만듭니다.다음을 제공합니다.
    {
        "name": "Net6NpmWebpack",
        "description": "ASP.NET Core MVC project with npm and webpack front-end configuration.",
        "repository": "https://gitlab.com/kdg-ti/integratieproject-1/guides/net6npmwebpack",
        "license": "MIT",
        "version": "4.0.0",
        "dependencies": {
            "@popperjs/core": "^2.11.2",
            "jquery": "^3.6.0",
            "jquery-validation": "^1.19.3",
            "jquery-validation-unobtrusive": "^3.2.12",
            "bootstrap": "^5.1.3"
        },
        "devDependencies": {
            "webpack": "^5.70.0",
            "webpack-cli": "^4.9.2",
            "css-loader": "^6.7.1",
            "style-loader": "^3.3.1"
        },
        "scripts": {
            "build": "webpack"
        }
    }
    
    이러한 단계를 기존 프로젝트에 적용하려면 처음 다섯 필드의 값을 변경해야 합니다.
    우리가 지정한 뚜렷한 필드를 제외하고는:
  • dependencies: 부트 5, JQuery,
    및 Popper(팝업 배치용 Bootstrap 사용)
  • devDependencies: 패키지 및 패키지 관련
    적재기.우리는 우리의 전단 코드를 묶기 위해 이것들이 필요하다.
  • scripts: 호출
    웹 패키지 번들 프로세스
  • 계속하여 다음 명령을 ClientApp 디렉토리에서 실행합니다.
    $ npm install
    
    node_modules 디렉토리가 팝업되고 JS와 CSS 파일이 많이 포함됩니다.이 디렉토리를 binobj 디렉토리로 간주합니다(또는 NuGet 패키지 캐시).비록 이것은 어떠한 바이너리 파일도 포함하지 않지만, 그것의 내용은 여전히 우리가 자신의 코드에서 인용한 대량의 의존항이다.
    ...하지만 우리는 아직 아무런 코드도 없다.srcClientApp 디렉터리를 만들고 이 위치에 jscss 디렉터리를 추가합니다.site.js 디렉토리에 js이라는 새 파일을 만들고 wwwroot/css/site.cssViews/Shared/_Layout.cshtml.css의 컨텐츠를 ClientApp/src/css으로 이동합니다.다음과 같이 하십시오.
    ClientApp/
    ├── package-lock.json
    ├── package.json
    └── src
        ├── css
        │   └── site.css  # contents of wwwroot/css/site.css and Views/Shared/_Layout.cshtml.css
        └── js
            └── site.js   # newly created
    
    정리는 매우 중요하기 때문에 목록 wwwroot/csswwwroot/js을 완전히 삭제하고 Views/Shared/_Layout.cshtml.css을 삭제하는 데 시간이 걸립니다.site.js에서는 사이트 전체와 관련된 사용자 정의 JavaScript 코드를 작성합니다.또한 이 파일을 사용하여 모든 사이트 범위의 종속성을 가져옵니다.
    // JS Dependencies: Popper, Bootstrap & JQuery
    import '@popperjs/core';
    import 'bootstrap';
    import 'jquery';
    // Using the next two lines is like including partial view _ValidationScriptsPartial.cshtml
    import 'jquery-validation';
    import 'jquery-validation-unobtrusive';
    
    // CSS Dependencies: Bootstrap
    import 'bootstrap/dist/css/bootstrap.css';
    
    // Custom JS imports
    // ... none at the moment
    
    // Custom CSS imports
    import '../css/site.css';
    
    console.log('The \'site\' bundle has been loaded!');
    
    2행에서 9행까지는 node_modules에서 코드를 가져옵니다.Bootstrap의 Javascript, Popper, CSS, 그리고 ASP에서 사용하는 몇 개의 JQuery 라이브러리를 가져오고 있습니다.NET 코어의 검증 스크립트입니다.
    이 모든 것은 ECMAScript 6 modules으로 완성된 것으로 다른 JS 파일, 심지어 JS 파일에서 CSS 파일을 가져오는 현대적인 방법이다.
    지금... 우리는 어떻게 해야만 이 코드들을 사용자의 브라우저에 입력할 수 있습니까?우리가 방금 만든 파일은 17줄 코드만 포함하지만, 일부 라이브러리와 사용자 정의 CSS 코드를 가져옵니다.우리는 단지 사용자에게 node_modules을 던질 뿐입니까?당연히 아니지!이 디렉터리는 매우 커서, 우리는 꼼꼼하게 선별, 묶음, 위탁 관리 운행에 필요한 부분을 선택해야 한다.
    이것이 바로 웹 패키지의 용무의 땅이다!

    번들 구성webpack.config.js이라는 새 파일을 만들고 ClientApp 디렉터리에 저장합니다.다음을 제공합니다.
    const path = require('path');
    
    module.exports = {
        entry: {
            site: './src/js/site.js'
        },
        output: {
            filename: '[name].entry.js',
            path: path.resolve(__dirname, '..', 'wwwroot', 'dist')
        },
        devtool: 'source-map',
        mode: 'development',
        module: {
            rules: [
                {
                    test: /\.css$/,
                    use: ['style-loader', 'css-loader'],
                },
                {
                    test: /\.(eot|woff(2)?|ttf|otf|svg)$/i,
                    type: 'asset'
                },
            ]
        }
    };
    
    상세하지 않은 상황에서 우리는 src/js/site.js을 바탕으로 bundle를 만들어야 한다고 지정했다. 이 bundle는 site.entry.js([name]의 자리 차지 문자가'site'로 바뀐다)이라고 해야 한다.
    패키지는 스마트해서 패키지에 어떤 내용이 포함되어야 하는지 확인할 수 있다. 패키지의 결정은 우리가 site.js에서 한 일에 기반을 두고 있다.예를 들어, JQuery를 가져오면 JQuery가 패키지에 포함됩니다.site.js에서 CSS 파일을 가져오는 것을 선택하면 Bootstrap에서 온 CSS 파일도 가방에 포함됩니다.(아래쪽 rules 섹션에서는 이러한 비JS 파일을 처리하는 방법을 지정했습니다.)
    좋습니다. ClientApp 디렉토리에서 다음 명령을 사용하여 구축해 보겠습니다.
    $ npm run build
    
    기본적으로 webpack 명령을 집행하는데 위 scriptspackage.json 부분과 같다.
    이렇게 하면 두 개의 새 파일이 생성됩니다.
    wwwroot/dist/
    ├── site.entry.js
    └── site.entry.js.map
    
    이제 이러한 컨텐트를 HTML에 포함할 수 있습니다.Views/Shared/_Layout.cshtml을 열고 모든 scriptlink 라벨을 교체합니다(밑에 라벨이라도!)단 한 줄:
     <!DOCTYPE html>
     <html lang="en">
     <head>
         <meta charset="utf-8" />
         <meta name="viewport" content="width=device-width, initial-scale=1.0" />
         <title>@ViewData["Title"] - net6npmwebpack</title>
    +    <script src="~/dist/site.entry.js" defer></script>
    -    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
    -    <link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
    -    <link rel="stylesheet" href="~/net6npmwebpack.styles.css" asp-append-version="true" />
     </head>
     <body>
         <header>
             <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
                 <div class="container-fluid">
                     <a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">net6npmwebpack</a>
                     <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                             aria-expanded="false" aria-label="Toggle navigation">
                         <span class="navbar-toggler-icon"></span>
                     </button>
                     <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
                         <ul class="navbar-nav flex-grow-1">
                             <li class="nav-item">
                                 <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Home</a>
                             </li>
                             <li class="nav-item">
                                 <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
                             </li>
                         </ul>
                     </div>
                 </div>
             </nav>
         </header>
         <div class="container">
             <main role="main" class="pb-3">
                 @RenderBody()
             </main>
         </div>
    
         <footer class="border-top footer text-muted">
             <div class="container">
                 &copy; 2022 - net6npmwebpack - <a asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
             </div>
         </footer>
    -    <script src="~/lib/jquery/dist/jquery.min.js"></script>
    -    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
    -    <script src="~/js/site.js" asp-append-version="true"></script>
         @await RenderSectionAsync("Scripts", required: false)
     </body>
     </html>
    
    defer은 이 파일의 실행이 페이지가 완전히 불러올 때까지 지연되어야 한다는 것을 나타낸다.이것은 스크립트가 DOM을 스캔하기 전에 문서를 완전히 다운로드할 수 있도록 모든 script 태그를 문서 밑에 두는 현대적인 대안입니다.
    프로젝트 트리에서 마지막 혼란을 삭제할 때가 되었습니다.
    $ rm -rf wwwroot/lib
    
    나처럼 쓸데없는 댓글에 푹 빠진다면 site.css의 가장 중요한 댓글을 삭제할 때가 됐다.어떤 축소 참고든지 간에 우리는 어쨌든 이 길을 가지 않을 것이다.
    git를 사용한다면 wwwroot/dist/.gitignore에 추가하십시오.
    됐어, 가볼 때가 됐어!
    $ dotnet run
    
    브라우저에서 localhost을 열고 브라우저 콘솔(F12)을 확인합니다."사이트 패키지가 불러왔습니다."라는 메시지를 보실 수 있을 것입니다.
    이게 얼마나 멋있어요?전단의 모든 의존항은 현재 동적 다운로드, 구축, 귀속을 할 수 있습니다.시스템 구축은 확장 가능하고 모든 의존항을 쉽게 관리할 수 있으며 필요하면 바꿀 수 있습니다!
    지금까지 이 프로젝트는 Gitlab에서 찾을 수 있으며 주소는 version 2/Net6NpmWebpack이다.

    다음은요?
    우리는 아직 완성하지 못했다.우리의 업무 명세서에는 두 가지 중요한 일이 있다.

  • 공연!두 모드 간 빠른 전환 시도
    수욕 센터의 다른 페이지.딜레이가 보일 거예요.
    Bootstrap의 CSS를 적용하기 전에이것 은
    대량의 CSS가 삽입됨
    런타임에 페이지를 엽니다.이게 제일 긴급한 거예요.
    해결해야 할 문제는 사용자 체험이 너무 나쁘다는 것이다
    중요!

  • 프로젝트를 하나의 전체로 건설하다.이것 보세요
    중점은 세우는 것이다.NET 항목은 트리거되지 않습니다.
    전면 복구.정말 짜증나!
  • 좋은 웹페이지 즐겨찾기