next.js學(xué)習(xí)筆記

1 安裝 npx create-next-app
2 _app.js _document.js server.js
3 css 這使用了一個(gè)名為styled-jsx的庫(kù)。這是一個(gè)“ CSS-in-JS”庫(kù)-它使您可以在React組件中編寫CSS,并且CSS樣式將受到限制(其他組件不會(huì)受到影響)。

==Next.js內(nèi)置了對(duì)styled-jsx的支持,但是您也可以使用其他流行的CSS-in-JS庫(kù)踊东,例如styled-components或情感。
==Next.js具有對(duì)CSS和Sass的內(nèi)置支持,可讓您導(dǎo)入.css和.scss文件呻粹。
==還支持使用流行的CSS庫(kù),例如Tailwind CSS苏研。
==要使用CSS模塊等浊,CSS文件名必須以結(jié)尾.module.css
==要加載全局CSS文件,請(qǐng)創(chuàng)建一個(gè)名為_app.js under 的文件

4 _app.js

該App組件是頂級(jí)組件摹蘑,將在所有不同頁面上通用筹燕。App例如,在頁面之間導(dǎo)航時(shí)衅鹿,可以使用此組件來保持狀態(tài)

5自定義PostCSS配置

開箱即用撒踪,無需配置,Next.js使用PostCSS編譯CSS 大渤。

6 搭配material ui

如果不配置制妄,會(huì)對(duì)樣式有影響
我們很清楚這個(gè)問題。我們最近引入了SSR API泵三,它創(chuàng)建了更多的約束耕捞,更易于使用,并且應(yīng)該減少出現(xiàn)此類問題的可能性切黔。
雖然您必須在v3中配置_document.js和_app.js砸脊,但使用v4配置_document.js就足夠了。

參考https://github.com/mui-org/material-ui/blob/v3.x/examples/nextjs/pages/_document.js
https://itnext.io/next-js-with-material-ui-7a7f6485f671
__document.js
/* eslint-disable react/jsx-filename-extension */
import React from 'react';
import Document, {
  Html, Main, NextScript,
} from 'next/document';
import { ServerStyleSheets } from '@material-ui/core/styles';

export default class MyDocument extends Document {
  render() {
    return (
      <Html lang="en">
        <body>
          <Main />
          <NextScript />
        </body>
      </Html>
    );
  }
}

// `getInitialProps` belongs to `_document` (instead of `_app`),
// it's compatible with server-side generation (SSG).
MyDocument.getInitialProps = async (ctx) => {

  // Render app and page and get the context of the page with collected side effects.
  const sheets = new ServerStyleSheets();
  const originalRenderPage = ctx.renderPage;

  ctx.renderPage = () => originalRenderPage({
    enhanceApp: (App) => (props) => sheets.collect(<App {...props} />),
  });

  const initialProps = await Document.getInitialProps(ctx);

  return {
    ...initialProps,
    // Styles fragment is rendered after the app and page rendering finish.
    styles: [...React.Children.toArray(initialProps.styles), sheets.getStyleElement()],
  };
};

_app.js
React.useEffect(() => {
  // Remove the server-side injected CSS.
  const jssStyles = document.querySelector('#jss-server-side');
  if (jssStyles) {
    jssStyles.parentElement.removeChild(jssStyles);
  }
}, []);

要自定義PostCSS配置纬霞,您可以創(chuàng)建一個(gè)名為的頂級(jí)文件postcss.config.js凌埂。如果您正在使用Tailwind CSS之類的庫(kù),這將很有用诗芜。

7 獲取數(shù)據(jù)

node-fetch

8 國(guó)際化

(1)報(bào)錯(cuò)

You have not declared a namespacesRequired array on your page-level component: withI18nextTranslation(Home). This will cause all namespaces to be sent down to the client, 
possibly negatively impacting the performance of your app. For more info, 
see: https://github.com/isaachinman/next-i18next#4-declaring-namespace-dependencies

(1)解決

Custom404.getInitialProps = async () => ({
    namespacesRequired: ['common'],
})

(2)版本6.02開始 無服務(wù)器
設(shè)置 _app.js

// import React, { useEffect } from 'react';
// import '../styles/global.css'
// import { appWithTranslation } from '../i18n'
// function App({ Component, pageProps }) {
//     useEffect(() => {
//         const jssStyles = document.querySelector('#jss-server-side');
//         if (jssStyles) {
//             jssStyles.parentElement.removeChild(jssStyles);
//         }
//     }, []);

//     return <Component {...pageProps} />
// }
// export default appWithTranslation(App)

import App from 'next/app'
import React, { useEffect } from 'react';
import { appWithTranslation } from '../i18n'

const MyApp = ({ Component, pageProps }) => {
    useEffect(() => {
        const jssStyles = document.querySelector('#jss-server-side');
        if (jssStyles) {
            jssStyles.parentElement.removeChild(jssStyles);
        }
    }, []);
    return <Component {...pageProps} />
}

MyApp.getInitialProps = async (appContext) => ({ ...await App.getInitialProps(appContext) })

export default appWithTranslation(MyApp)

(2)設(shè)置next.config.js

const { nextI18NextRewrites } = require('next-i18next/rewrites')

const localeSubpaths = {}

module.exports = {
    rewrites: async () => nextI18NextRewrites(localeSubpaths),
    publicRuntimeConfig: {
        localeSubpaths,
    },
}

(2)i18n.js

const i18n = require('i18next')
const NextI18Next = require('next-i18next').default
const detector = require('i18next-browser-languagedetector')
const { localeSubpaths } = require('next/config').default().publicRuntimeConfig
const path = require('path')
module.exports = new NextI18Next({
    defaultLanguage: 'en',
    otherLanguages: ['de'],
    fallbackLng: "en",
    browserLanguageDetection: true,
    localePath: path.resolve('./public/static/locales')
})

(3)設(shè)置_error.js

import PropTypes from 'prop-types'
import { withTranslation } from '../i18n'

const Error = ({ statusCode, t }) => (
    <p>
        {statusCode
            ? t('error-with-status', { statusCode })
            : t('error-without-status')}
    </p>
)

Error.getInitialProps = async ({ res, err }) => {
    let statusCode = null
    if (res) {
        ({ statusCode } = res)
    } else if (err) {
        ({ statusCode } = err)
    }
    return {
        namespacesRequired: ['common'],
        statusCode,
    }
}

Error.defaultProps = {
    statusCode: null,
}

Error.propTypes = {
    statusCode: PropTypes.number,
    t: PropTypes.func.isRequired,
}

export default withTranslation('common')(Error)

(3)設(shè)置404.js
(4)pages/404` can not have getInitialProps/getServerSideProps,

function Custom404() {
    return <h1>404 - Page Not Found</h1>
}
Custom404.getInitialProps = async () => ({
    namespacesRequired: ['common'],
})
export default Custom404
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瞳抓,一起剝皮案震驚了整個(gè)濱河市埃疫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌孩哑,老刑警劉巖栓霜,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異横蜒,居然都是意外死亡胳蛮,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門丛晌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仅炊,“玉大人,你說我怎么就攤上這事澎蛛「ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵谋逻,是天一觀的道長(zhǎng)呆馁。 經(jīng)常有香客問我,道長(zhǎng)毁兆,這世上最難降的妖魔是什么浙滤? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮气堕,結(jié)果婚禮上瓷叫,老公的妹妹穿的比我還像新娘。我一直安慰自己送巡,他們只是感情好摹菠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著骗爆,像睡著了一般次氨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上摘投,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天煮寡,我揣著相機(jī)與錄音,去河邊找鬼犀呼。 笑死幸撕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的外臂。 我是一名探鬼主播坐儿,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了貌矿?” 一聲冷哼從身側(cè)響起炭菌,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎逛漫,沒想到半個(gè)月后黑低,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡酌毡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年克握,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枷踏。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡玛荞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出呕寝,到底是詐尸還是另有隱情,我是刑警寧澤婴梧,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布下梢,位于F島的核電站,受9級(jí)特大地震影響塞蹭,放射性物質(zhì)發(fā)生泄漏孽江。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一番电、第九天 我趴在偏房一處隱蔽的房頂上張望岗屏。 院中可真熱鬧,春花似錦漱办、人聲如沸这刷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽暇屋。三九已至,卻和暖如春洞辣,著一層夾襖步出監(jiān)牢的瞬間咐刨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工扬霜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留定鸟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓著瓶,卻偏偏與公主長(zhǎng)得像联予,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353