這篇文章的環境是Windows, 正好也說一下Windows下前段開發的工具鏈react
1. 安裝巧克力 https://chocolatey.org/instal...git
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
2. 安裝Yarngithub
安裝Yarn包管理器會自動安裝Nodejs. shell
3. 建立項目express
md next.js-blog cd next.js-blog yarn init -y # 安裝依賴模塊 yarn add express next@latest next-routes react react-dom styled-components # 開發依賴模塊 yarn add --dev babel-plugin-module-resolver babel-plugin-styled-components
babel-plugin-module-resolver
是一個Babel模塊解析插件, 在.babelrc
中能夠配置模塊的導入搜索路徑. 好比:json
{ "presets": [ "next/babel" ], "plugins": [ ["styled-components", { "ssr": true, "displayName": true, "preprocess": false } ], ["module-resolver", { "root": ["./"] }] ] }
由於.babelrc
文件的路徑在項目根, 咱們指定配置module-resolver
的root
爲"./", 所以咱們在使用相似import X from 'path'
導入模塊的使用能夠不指定../../
這種相對路徑, 默認以項目根爲模塊的搜索路徑, 好比, 能夠在./pages/index.js
頁面中導入位於./layouts
的DefaultLayout.js
模塊,而不用添加../
做爲相對路徑:segmentfault
// filename: ./pages/index.js # 自動路徑搜索 import DefaultLayout from 'layouts/DefaultLayout' # 相對路徑 import DefaultLayout from '../layouts/DefaultLayout'
上面兩種導入方式效果是相同的, 第一種的前提是你要配置 module-resolver
服務器
在這裏咱們使用 styled-components
組件, 關於styled-components
如何使用, 請諮詢 Google, 這裏就不詳細說明了, 使用上是很簡單的.babel
一個頁面, 最基本的就是佈局了, 頁頭, 內容, 頁腳. 最基本的三塊, 每一個頁面的頁頭和頁腳基本都是相同的, 頁頭和頁腳能夠做爲公共組件使用, 內容通常做爲一個容器組件去包含咱們實際須要顯示的內容, 在這裏實際上對於一個博客系統來講, 咱們須要顯示博客列表頁和博客內容頁.dom
import Head from 'next/head' import styled from 'styled-components'; import Navigation from '../components/Navigation' import Footer from '../components/Footer' // 定義一個DIV容器組件, 用於包裹整個頁面. const Container = styled.div` display: flex; min-height: 100vh; flex-direction: column; main { flex: 1; } `; export default ({ children, title = '默認標題' }) => ( <Container> <Head> <title>{ title }</title> </Head> <header> <Navigation /> </header> <main> { children } </main> <Footer> 這是頁腳 </Footer> </Container> )
// export default () => ( // <div>Welcome to next.js!</div> // ) import React from 'react' import DefaultLayout from 'layouts/DefaultLayout' import Post from '../components/PostItem' import posts from '../data/posts.json' console.log(posts) const IndexPage = ({ posts }) => ( <DefaultLayout> <ul> {posts.map(p => ( <Post key={p.title} post={p} /> ))} </ul> </DefaultLayout> ) IndexPage.getInitialProps = async ({ req }) => { // const res = await getPosts() // const json = await res.json() return { posts: posts } } export default IndexPage
_document.js
另外在 ./pages
目錄下還有一個特殊的文件_document.js
, 用於控制整個頁面的骨架. 這個自定義的 _document.js
能夠讓你覆蓋默認的頁面佈局, 注入如你本身的樣式, 等等.
這裏爲了簡化, 我只是使用了一個JSON文件, 其中包含了博客的標題, 鏈接等信息. 把posts.json
文件導入爲一個JavaScript對象. 能夠直接使用
https://github.com/developerw...
注:
Windows 下的Git命令注意設置一下:git config --global core.autocrlf false
Next.js通用動態路由 (何謂通用? 就是在服務器端和客戶端均可以使用的路由)