npx create-nuxt-app blog-for-developers
Lệnh trên sẽ bắt đầu một dấu nhắc giao diện dòng lệnh (CLI) cho phép chúng ta định cấu hình các khía cạnh khác nhau của dự án của mình. Bây giờ bảng soạn sẵn đã được thiết lập với tất cả các tệp và thư mục, hãy chạy máy chủ phát triển có thể truy cập trên
//localhost:3000
bên trong dự án. # change directory to project folder
cd blog-for-developers
# start the development environment
npm run dev
Nuxt là gì?
NuxtJS là một khung công tác Vue trực quan mã nguồn mở cho phép chúng tôi xây dựng giao diện người dùng, giúp cho việc phát triển web trở nên đơn giản và mạnh mẽ.
Nội dung Nuxt là gì?
Trong quá trình thiết lập ban đầu của dự án này, chúng tôi đã chọn mô-đun nội dung Nuxt. Mô-đun này cho phép chúng tôi sử dụng cơ sở mã của mình như một CMS không đầu dựa trên Git để truy cập các tệp markdown, JSON, YAML, XML và thậm chí cả CSV thông qua giao diện giống API. Với mô-đun này
@nuxt/content
, nó sẽ tiêm $content
ví dụ trên toàn cầu trong dự án của chúng tôi để truy cập nó ở bất kỳ đâu trong dự án. Cloudinary là gì?
Cloudinary là một công cụ quản lý hình ảnh và video dịch vụ đám mây cho các ứng dụng web và di động. Với Cloudinary, chúng tôi có thể tải lên, tạo và quản lý trải nghiệm kỹ thuật số trên mọi trình duyệt và thiết bị.
Trước khi chúng tôi tạo nội dung cho blog trong phần đánh dấu bằng cách sử dụng nội dung Nuxt, trước tiên hãy tạo trang đích cho blog sẽ bao gồm các liên kết điều hướng và một số văn bản.
Thêm kiểu phông chữ
bên trong
nuxt.config.js file
, chúng ta có thể thêm phông chữ yêu thích của mình vào phần đầu và sử dụng một họ phông chữ cụ thể như bên dưới: Khối mã trên sẽ không có hiệu lực trên trang cho đến khi chúng ta viết CSS sẽ sử dụng phông chữ.
Bây giờ, hãy thêm mã sau vào
pages/index.vue
sẽ bao gồm các liên kết điều hướng và một số văn bản trên trang chủ. Xóa thành phần, <Tutorial />
. <template> <section class =" showcase "> < header > < h2 class =" logo "> < nuxt - link to ="/"> ecosurf </ nuxt - link > </ h2 > < nav class =" nav desktop "> < ul > < li class =" nav__list "> < nuxt - link to ="/ blogs "> Stories </ nuxt - link > </ li > </ ul > </ nav > </ header > < video
autoplay
loop muted
src =" https: // res . cloudinary . com / terieyenike / video / upload / v1651393236 / mixkit - tropical - island - landscape - view - 4692 - large_yanvml . mp4 "></ video > < div class =" overlay "></ div > < div class =" text "> < h2 data - type =" uppercase " class =" stroke "> Never Stop </ h2 > < h3 data - type =" uppercase "> Exploring The World </ h3 > < p > View of the tropical island landscape, from a hill with houses, palm
trees and many trees, and in the distance the hills that surround the
sea, on a sunny day . </ p > </ div > < ul class =" social "> < li > < a href =" https: // twitter . com / terieyenike " rel =" noopener noreferrer " target =" _blank ">< img
alt =" twitter profile " src =" https: // i . ibb . co / Wnxq2Nq / twitter . png "/></ a > </ li > < li > < a href =" https: // instagram . com / terieyenike " rel =" noopener noreferrer " target =" _blank ">< img
alt =" instagram profile " src =" https: // i . ibb . co / ySwtH4B / instagram . png "/></ a > </ li > </ ul > </ section > </ template >
Trong khối mã trên, chúng tôi đã bao gồm một
<video>
với nguồn video được lưu trữ trong Cloudinary với các thuộc tính như tự động phát, vòng lặp và tắt tiếng giúp tắt tiếng video khi tải. Để có được phương tiện được lưu trữ trong Cloudinary, chúng tôi tải video mong muốn của mình lên tab thư viện phương tiện. Sau đó, sao chép URL sẽ được đính kèm với src
sau đó <video>
. Ngoài ra, chúng tôi đã tham chiếu các liên kết trong tiêu đề điều hướng với
nuxt-link
thành phần cho cả nhà /
và /blogs
các tuyến đường mà chúng tôi sẽ tạo để xem tất cả các blog của chúng tôi. assets/styles/main.css
và bao gồm những điều sau từ chính này. nuxt.config.js
, cập nhật tệp để bao gồm tệp CSS đã tạo với các nội dung sau: export default { ... css : [ '@/assets/styles/main.css' ], ... }
Để xây dựng trang blog của chúng tôi, chúng tôi cần có nội dung để hiển thị và hiển thị trên
/blogs
trang. Đầu tiên, hãy tạo một content
và sau đó là thư mục blog sẽ chứa tất cả các tệp đánh dấu. Viết tất cả nội dung trong markdown hỗ trợ rất nhiều tiêu chuẩn cú pháp markdown như tiêu đề, liên kết và khối mã với các cú pháp tô sáng cho các ngôn ngữ lập trình khác nhau. content/blogs/egghead.md
. --- title: Egghead cover _image: //res.cloudinary.com/terieyenike/image/upload/v1651446130/pexels-jeremy-bishop-8241100_ oklfpe.jpg author: Teri Eyenike description: All we need to do is open up our terminal and run the command npm install @nuxt/content. Once it's installed, you'll see that inside of our package.json, we see our Nuxt Content module. Next, to finalize the setup, let's go ahead and open up our nuxt.config.js, and let's go ahead and scroll down to the section that's labeled Modules. date: May 2, 2021 publishOn: 2022-05-02T00:00:00 tags: ["learning", "platform"] --- [ Egghead ]( //www.egghead.io ) is a great platform for developers to enhance their skills! <!-- more content -->
Tìm nạp các bài đăng
Để tìm nạp các bài đăng cho trang blog, hãy tạo một lộ trình mới trong
pages
. Tạo một thư mục, được gọi là blog và trong đó tạo index.vue
tập tin cho thư mục, blog. pages/blogs/index.vue
để hiển thị các tệp đánh dấu đã kết xuất. // pages/blogs/index.vue
<template> < main >
< header >
< h2 class = "logo" >
< nuxt-link to = "/" > ecosurf </ nuxt-link >
</ h2 >
< nav class = "nav desktop" >
< ul >
< li class = "nav__list" >
< nuxt-link to = "/blogs" > Stories </ nuxt-link >
</ li >
</ ul >
</ nav >
</ header >
< div class = "container section" >
< div class = "container__grid" >
< div v-for = "blog in blogs" :key = "blog.slug + blog.createdAt" class = "card" >
< img :src = "blog.cover_image"
alt = "blog photographs" />
< div class = "pad__card" >
< div class = "author" >
< p class = "author__name" > {{ blog.author }} </ p > < span > | </ span >
< p > {{ blog.date }} </ p >
</ div >
< h2 class = "title" > {{ blog.title }} </ h2 >
< p > {{ blog.description.substring(0, 150) }}... </ p >
< button >
< nuxt-link :to = "`/blogs/${blog.slug}`" > Read More </ nuxt-link >
</ button >
</ div >
</ div >
</ div >
</ div >
</ main >
</template> < script >
export default { async asyncData ( {$content} ) { const blogs = await $content( "blogs" ).sortBy( "publishOn" , "desc" ).fetch() return { blogs } }, head ( ) { return { title : "Read interesting stories as a nomad" , meta : [ { hid : 'description' , name : 'description' , content : 'Daily and juicy content as you learn, work, and relax. WFH'
} ] } } } </ script >
< style scoped >
header { background : #111111 ; position : unset; } .container { width : 85% ; max-width : 75rem ; margin -inline: auto; } .section { padding : 3em 0 ; } .container__grid { display : grid; gap: 2em ; grid-template- columns : repeat (auto-fit, minmax ( 19rem , 1 fr)); } .card { background : #f0f7f4 ; box-shadow : 0px 4px 3px rgba ( 0 , 0 , 0 , 0.1 ); border-radius : 5px ; } .card img { object-fit : cover; border-top-left-radius : 5px ; border-top-right-radius : 5px ; width : 100%
} .pad__card { padding : 2em ; } .author { display : flex; align-items : center; } .author , .title { margin-bottom : 1em ; } .author span { margin : 0 0.3em ; } .author__name { text-transform : capitalize; } button { border : unset; padding : 1em 2em ; margin-top : 2em ; background : #0D5159 ; font-weight : 700 ; cursor : pointer; } button a { color : #fff ; } </ style >
asyncData
: được sử dụng để tạo trang của chúng tôi từ Nuxt vì nó tạo các tệp riêng lẻ một cách tĩnh cho người dùng. Chúng tôi vượt qua trong $content
phương pháp lưu trữ các ghi chú blog, sortBy()
chức năng và fetch
phương pháp. sortBy()
: có hai tham số, publishOn
(sắp xếp theo ngày) và các thuộc tính mô tả về cách bạn muốn nội dung xuất hiện dựa trên nội dung được xuất bản gần đây nhất /blogs/
nút blog trên nút Đọc thêm bằng cách sử dụng <nuxt-link>
thành phần. Kết xuất các bài đăng
Bước cuối cùng để xem đoạn mã của các bài đăng được hiển thị từ thư mục nội dung là sử dụng lệnh v-for và lặp qua các blog và hiển thị từng bài viết trong một thẻ.
Bây giờ chúng ta hãy tạo các trang cho mỗi bài đăng trên blog để có các tuyến URL động. Trong Nuxt, để tạo các trang động, chúng tôi thêm dấu gạch dưới trước tên tệp .vue để không làm cho URL bị mã hóa cứng.
Sau đó, chúng tôi tạo ra
_slug.vue
tệp trong thư mục blog và thêm mã sau: // pages/blogs/_slug.vue
<template> < main >
< header >
< h2 class = "logo" >
< nuxt-link to = "/" > ecosurf </ nuxt-link >
</ h2 >
< nav class = "nav desktop" >
< ul >
< li class = "nav__list" >
< nuxt-link to = "/blogs" > Stories </ nuxt-link >
</ li >
</ ul >
</ nav >
</ header >
< div class = "container" >
< div class = "return" >
< nuxt-link to = "/" >
< img alt = "back to home" src = "/home.png" />
</ nuxt-link >
< span > / </ span >
< nuxt-link to = "/blogs" > Blog </ nuxt-link >
< span > / </ span >
< p > {{ note.title.substring(0, 15) }}... </ p >
</ div >
< section >
< h1 > {{ note.title }} </ h1 >
< nuxt-content :document = "note" cla />
</ section >
</ div >
</ main >
</template> < script >
export default { async asyncData ( {$content, route} ) { const note = await $content( `blogs/ ${route.params.slug} ` ).fetch() return { note } } } </ script >
< style scoped >
header { background : #111111 ; position : unset; } .container { width : 85% ; max-width : 75rem ; margin -inline: auto; } section { padding-bottom : 2em ; } .return { display : flex; margin : 1.5em 0 ; } .return img { width : 20px ; height : 20px ; } .return span { margin : 0 1em ; } h1 { margin-bottom : 1em
} </ style >
${route.params.slug}
: Chúng tôi sử dụng nội dung để tìm nạp một tệp cụ thể từ các blog thư mục bằng cách sử dụng tham số route và slug sẽ ánh xạ đến tên tệp thực của chúng tôi document
với toàn bộ note
sự vật scoped
: Xác định phạm vi cho phần tử kiểu đảm bảo rằng kiểu chỉ áp dụng cho một trang cụ thểTìm hiểu thêm