Nuxt 및 가격 인하로 놀이터 만들기

16560 단어 vuenuxttutorial
나는 최근에 줄곧 Nuxt와 접촉하여 자신과 고객을 위해 생각의 원형을 설계하고 있다.나는 명령줄에서 프로그램을 안내하는 데 매우 유용한 기본 도구를 사용하는 것을 정말 좋아한다.Nuxt는 바로 사용할 수 있는 좋은 것들이 있습니다.
  • 이것은 Vue 응용 프로그램을 만드는 프레임워크로 클라이언트/서버의 복잡성을 추상화할 수 있다.즉, 새 애플리케이션의 시작점으로 사용하거나 기존 API를 삽입할 수 있습니다.
  • 초보자 템플릿에서 셸 응용 프로그램의 명령줄을 생성합니다. 이 명령줄에는 검색 엔진의 최적화와 빠른 불러오는 시간에 사용할 서버 사이드 렌더링이 내장되어 있습니다.
  • 서버 사이드 프레임워크 도입(필요하지만 항상 그렇지는 않음), UI 프레임워크, 테스트 프레임워크, linting,prettifying, HTTP 요청을 보내는 라이브러리 (Axios).
  • 이 프로젝트에 대해 저는 Vue와 Nuxt를 사용하는 기본적인 가격 인하 블로그 체험을 원합니다. 그러면 저는 둘 다 놀이터를 제공할 수 있습니다.
    이게 어떻게 된 일이야, 너도 스스로 꺼져도 돼.다음 단계를 완료합니다.
  • 셸 응용 프로그램 만들기
  • 태그 파일 로드
  • 블로그 게시물 표시
  • 게시물 목록 보이기
  • 정적 사이트에 대한 동적 라우팅 생성
  • 마지막으로 얻다this.
    아니면 귀찮으면 GitHub 리턴 here 에서 가져가세요.

    셸 응용 프로그램 만들기


    명령줄에서 다음 명령을 실행하여 기본 Nuxt starter 템플릿에서 셸 응용 프로그램을 만듭니다.yarn create nuxt-app starter-for-nuxt-markdown-blog다음은 출력 결과입니다.
    ➜  examples yarn create nuxt-app starter-for-nuxt-markdown-blog
    yarn create v1.17.3
    [1/4] 🔍  Resolving packages...
    [2/4] 🚚  Fetching packages...
    [3/4] 🔗  Linking dependencies...
    [4/4] 🔨  Building fresh packages...
    
    success Installed "[email protected]" with binaries:
          - create-nuxt-app
    [#################################################################################################################################################################################################] 373/373
    create-nuxt-app v2.10.1
    ✨  Generating Nuxt.js project in starter-for-nuxt-markdown-blog
    ? Project name starter-for-nuxt-markdown-blog
    ? Project description Starter for a Nuxt Markdown Blog
    ? Author name Jenna Pederson
    ? Choose the package manager Yarn
    ? Choose UI framework Bulma
    ? Choose custom server framework None (Recommended)
    ? Choose Nuxt.js modules (Press <space> to select, <a> to toggle all, <i> to invert selection)
    ? Choose linting tools ESLint
    ? Choose test framework None
    ? Choose rendering mode Universal (SSR)
    ? Choose development tools jsconfig.json (Recommended for VS Code)
    yarn run v1.17.3
    $ eslint --ext .js,.vue --ignore-path .gitignore . --fix
    ✨  Done in 3.35s.
    
    🎉  Successfully created project starter-for-nuxt-markdown-blog
    
      To get started:
    
        cd starter-for-nuxt-markdown-blog
        yarn dev
    
      To build & start for production:
    
        cd starter-for-nuxt-markdown-blog
        yarn build
        yarn start
    
    ✨  Done in 191.25s.
    
    응용 프로그램을 만든 후 다음 도구를 사용하여 기본 Nuxt starter 템플릿을 회전하여 모양을 확인합니다.yarn dev그리고 http://localhost:3000로 가세요.

    태그 파일 로드


    다음은 frontmatter-markdown-loader 패키지를 사용하여 content라는 디렉터리에서 가격 인하 파일을 불러오고 모든 게시물에 대한 가격 인하 프론트 매트릭스 (가격 인하 파일에 대한 메타데이터는 본 예에서 제목, 라벨, 영웅 이미지 등 메타데이터를 발표하는 방문권을 얻습니다.
    패키지 추가:yarn add frontmatter-markdown-loader컨텐츠 디렉토리를 만들려면 다음과 같이 하십시오.mkdir -P content/blog첫 번째 게시물을 만들려면 this filecontent/blog 에 넣으십시오.
    그리고 이미지 자산에 대한 관련 디렉터리를 만듭니다.mkdir -P assets/images/blogthis imageassets/images/blog에 추가합니다.
    현재 저희는 frontmatter-markdown-loadernuxt.config.js 에 추가하는 구축 절차를 통해 웹 팩 설정을 확장할 수 있는 내용이 있습니다.
    build: {
        ...
        extend(config, ctx) {
          config.module.rules.push(
            {
                test: /\.md$/,
                include: path.resolve(__dirname, "content"),
                loader: "frontmatter-markdown-loader",
            }
          );
        }
    }
    

    블로그 게시물 표시


    우리는 모든 게시물에 대해 정적 페이지를 만들 필요가 없기 때문에 동적 루트를 사용하여 가격 인하 파일을 끌어들일 것이다.다음 URL 경로를 고려합니다./blog/2019-09-22-veggies /blog/:blog_post_title또는/users/jenna-pederson /users/:username이 두 예에서 :blog_post_title:username 은 노선의 동적 부분이나 세그먼트를 나타낸다.
    블로그 디렉토리를 만들려면 다음과 같이 하십시오.mkdir pages/blog우리는 blog 디렉터리를 만들고 _slug.vue 파일을 추가할 것입니다.이 _slug.vue 파일은 우리 블로그 글의 Vue 템플릿이 될 것입니다.pages/blog/_slug.vue에 다음 기본 템플릿을 추가합니다.
        <template>
          <div class="container">
            <h1 class="title">
              {{ post.attributes.title }}
            </h1>
            <h2 class="subtitle">
              {{ post.attributes.date }}
            </h2>
            <div class="columns">
              <div class="column is-half is-offset-one-quarter">
                <figure class="image">
                  <img :src="imgSrc">
                </figure>
              </div>
            </div>
            <!-- eslint-disable-next-line -->
            <div class="content" v-html="post.html" />
          </div>
        </template>
        <script>
        export default {
          computed: {
            imgSrc () {
              return require(`~/assets/images/blog/${this.post.attributes.hero}`)
            }
          },
          async asyncData ({ params }) {
            try {
              const post = await import(`~/content/blog/${params.slug}.md`)
              return {
                post
              }
            } catch (error) {
              return false
            }
          },
          head () {
            return {
              title: this.post.attributes.title
            }
          }  
        }
        </script>
    
    asyncData에서 얻은 slug 값에 따라 가격 인하 파일을 가져왔습니다.마찬가지로 slug는 URL로 정의됩니다.예를 들어 우리의 URLhttp://localhost:3000/blog/2019-09-22-veggies의 slug는 params이기 때문에 2019-09-22-veggies 파일을 가져오고post 대상을 구성 요소에 분배하는 데이터입니다.
    우리는 가격 인하에서 원래 HTML을 나타내기 위해 2019-09-22-veggies.md 명령을 사용합니다.이것은 eslint 경고를 초래할 수 있습니다.v-htmlXSS 취약점herehere에 대한 자세한 내용을 볼 수 있습니다.컨텐트가 어디에서 왔는지 확인하십시오. 컨텐트를 작성하고 있는 경우 타사 UI 라이브러리에서도 보안 취약점을 발견할 수 있습니다.우리는 바로 위의 9:26 warning 'v-html' directive can lead to XSS attack vue/no-v-html 줄로 이 경고를 무시할 수 있다.
    이제 브라우저를 가리키고 댓글을 볼 수 있습니다!

    http://localhost:3000/blog/2019- 09-22 - 야채 게시물 목록 표시


    다음 단계는 저희 홈페이지의 블로그 게시물 목록을 표시하고 모든 게시물을 탐색할 수 있습니다.
    따라서 블로그 게시물 목록에 표시할 게시물이 여러 개 있습니다. eslint-disable-next-linethis postcontent/blog 에 추가하십시오.assets/images/blog 에서는 페이지에 표시할 수 있도록 모든 블로그 게시물을 Nuxt pages/index.vue 방법으로 다시 불러옵니다.앞으로 우리는 이러한 내용을 페이지로 나누거나 특색 있는 게시물만 불러와 사이트 홈페이지에 표시할 수 있다.그리고 템플릿에 asyncData 순환을 추가하여 게시물을 표시합니다.
        <template>
          <div class="container">
            <h1 class="title">
              Blog Posts
            </h1>
            <section class="posts">
              <div v-for="post in posts" :key="post.attributes.title" class="columns">
                <div class="column is-one-quarter">
                  <figure class="image">
                    <img :src="imgSrc(post)" :alt="post.attributes.title">
                  </figure>
                </div>
                <div class="column is-three-quarters">
                  <p class="title is-4">
                    <nuxt-link :to="post._path">
                      {{ post.attributes.title }}
                    </nuxt-link>
                  </p>
                  <p class="subtitle is-6">
                    {{ post.attributes.tags }}
                  </p>
                  <div class="content">
                    <p>{{ post.attributes.excerpt }}</p>
                    <p>{{ post.attributes.date }}</p>
                    <nuxt-link :to="post._path">
                      Read
                    </nuxt-link>
                  </div>
                </div>
              </div>
            </section>
          </div>
        </template>
    
        <script>
        export default {
          async asyncData () {
            const context = await require.context('~/content/blog', true, /\.md$/)
            const posts = await context.keys().map(key => ({
              ...context(key),
              _path: `/blog/${key.replace('.md', '').replace('./', '')}`
            }))
            return { posts: posts.reverse() }
          },
          methods: {
            imgSrc (post) {
              return require(`~/assets/images/blog/${post.attributes.hero}`)
            }
          }
        }
    
        </script>
    
    여기에서 v-for 디렉터리와 하위 디렉터리에 있는 모든 태그 파일을 불러옵니다.그리고 나서 우리는 모든 키 (파일 이름) 를 상하문과 우리가 원하는 다른 내용에 비추었다.이 예에서는 나중에 링크를 만들 수 있도록 게시물의 URL 경로에 content/blog 를 매핑합니다.상하문은 최종적으로frontmatter 태그 로드 프로그램이 불러오는 내용: 속성(태그 파일의frontmatter)과 html(html로 컴파일된 태그)이다.
    이제 브라우저를 가리킬 때 it's image
    http://localhost:3000/

    정적 사이트에 대한 동적 라우팅 생성


    우리는 또 한 가지 해야 할 일이 있다. 바로 사용할 동적 루트 true 를 설정하는 것이다. 이 단계는 생산에 사용할 정적 사이트를 생성할 것이다._path 에서 우리는 yarn generate 디렉터리의 가격 인하 파일에 따라 루트를 생성할 것이다.
    먼저 파일 맨 위에 nuxt.config.js 을 추가한 다음 정의content:const glob = require('glob')이것은 하나의 수조가 될 것이다...우리가 가격을 인하하는 서류의 경로.우리의 예에서, 우리는 단지 하나이지만, 당신은 그것을 markdownPaths 또는 당신이 필요로 하는 값으로 확장할 수 있습니다.
    그리고 이 파일의 밑에 이 함수를 추가합니다.
    function dynamicMarkdownRoutes() {
      return [].concat(
        ...markdownPaths.map(mdPath => {
          return glob.sync(`${mdPath}/*.md`, { cwd: 'content' })
            .map(filepath => `${mdPath}/${path.basename(filepath, '.md')}`);
        })
      );
    } 
    
    우리는 const markdownPaths = ['blog'] 블록에서 이 함수를 호출할 것이다.['blog', 'portfolio', 'photos', 'recipes'] 또는 generate.routes와 같은 수준에서 추가할 수 있습니다.
    generate: {
      routes: dynamicMarkdownRoutes()
    },
    
    이를 테스트하기 위해 명령줄로 돌아가 실행modules하면 다음과 같은 출력이 생성됩니다.
    ➜  starter-for-nuxt-markdown-blog git:(master) ✗ yarn generate
    yarn run v1.17.3
    $ nuxt generate
    ℹ Production build                                                                                                                                                                                16:54:52
    ✔ Builder initialized                                                                                                                                                                             16:54:52
    ✔ Nuxt files generated                                                                                                                                                                            16:54:52
    
    ✔ Client
      Compiled successfully in 6.85s
    
    ✔ Server
      Compiled successfully in 2.18s
    
    
    Hash: edf5326aac7133378e50
    Version: webpack 4.40.2
    Time: 6853ms
    Built at: 2019-09-25 16:55:01
                             Asset       Size   Chunks                                Chunk Names
    ../server/client.manifest.json   7.26 KiB           [emitted]
           125f300a35d8d87618b7.js   2.08 KiB        2  [emitted] [immutable]         pages/blog/_slug
           2eef474de7f0fce0b490.js   2.29 KiB        7  [emitted] [immutable]
           47f38e821f6391ec3abe.js   2.38 KiB        4  [emitted] [immutable]         runtime
           50c6bbcdbcd3e3f623ea.js   34.9 KiB        0  [emitted] [immutable]         app
           72339ed6891dc9a5bab0.js    192 KiB        5  [emitted] [immutable]         vendors.app
                          LICENSES  389 bytes           [emitted]
           d6bf890be21b759c97e5.js   3.38 KiB        6  [emitted] [immutable]
           dc728afc9091988c21a1.js   8.63 KiB  3, 6, 7  [emitted] [immutable]         pages/index
           fc1ca6aa66dbc344a014.js    152 KiB        1  [emitted] [immutable]         commons.app
                   img/8c66f4e.jpg   5.78 MiB           [emitted]              [big]
                   img/ca9c582.jpg   1.03 MiB           [emitted]              [big]
     + 2 hidden assets
    Entrypoint app = 47f38e821f6391ec3abe.js fc1ca6aa66dbc344a014.js 72339ed6891dc9a5bab0.js 50c6bbcdbcd3e3f623ea.js
    
    WARNING in asset size limit: The following asset(s) exceed the recommended size limit (244 KiB).
    This can impact web performance.
    Assets:
      img/8c66f4e.jpg (5.78 MiB)
      img/ca9c582.jpg (1.03 MiB)
    
    Hash: 898a2ef2951dc7e6c3b6
    Version: webpack 4.40.2
    Time: 2180ms
    Built at: 2019-09-25 16:55:03
                      Asset       Size   Chunks                         Chunk Names
    461c3c4ac5f760555a13.js   1.67 KiB        1  [emitted] [immutable]  pages/blog/_slug
    8ca9a115422e5af94cd9.js   2.32 KiB        4  [emitted] [immutable]
    abf1051240f49f9b6062.js   3.41 KiB        3  [emitted] [immutable]
    ec1f17082565c8004784.js   7.71 KiB  2, 3, 4  [emitted] [immutable]  pages/index
                  server.js    214 KiB        0  [emitted]              app
       server.manifest.json  603 bytes           [emitted]
     + 5 hidden assets
    Entrypoint app = server.js server.js.map
    ℹ Generating pages                                                                                                                                                                                16:55:03
    
     WARN  Cannot stringify POJOs with symbolic keys Symbol(Symbol.toStringTag)                                                                                                                       16:55:03
    
    
     WARN  Cannot stringify POJOs with symbolic keys Symbol(Symbol.toStringTag) (repeated 1 times)                                                                                                    16:55:03
    
    ✔ Generated /                                                                                                                                                                                     16:55:04
    ✔ Generated blog/2019-09-25-cupcake                                                                                                                                                               16:55:04
    ✔ Generated blog/2019-09-22-veggies                                                                                                                                                               16:55:04
    ✨  Done in 16.11s.
    
    이것은 build 디렉터리에 사이트를 생성합니다.만약 네가 테스트를 하고 싶다면 (아마도 너는 마땅히!)실시간 배포 전에 yarn generate 를 실행한 다음 dist 을 실행하여 이 디렉터리에서 정적 사이트의 HTTP 서버를 시작할 수 있습니다.
    이것이 너로 하여금 Nuxt와 가격 인하 파일을 사용하여 블로그를 만들기 시작하게 할 수 있기를 바란다.이 버전의 코드는 에서 확인할 수 있습니다.나는 더 많은 것을 세웠기 때문에 이 환매 협의를 계속 갱신할 것이다.아마도 우리는 기호 키로 POJO를 직렬화할 수 없거나 직사각형 포맷 날짜로 표시할 수 없다는 경고에 대해 깊이 연구할 것이다.헤드 없는 CMS에 연결할 수도 있습니다.
    Netlify의 선발로 나설 준비가 되셨나요?너도 이렇게 할 수 있어!
    here

    좋은 웹페이지 즐겨찾기