美文网首页
Next.js (上)

Next.js (上)

作者: kzc爱吃梨 | 来源:发表于2022-02-25 23:54 被阅读0次

    创建项目

    命令

    • npm init next-app nextjs-blog-1
    • 然后选择 Default starter app
    • yarn dev
    • 用浏览器打开控制台给出的网址

    Link快速导航

    用法

    • < a href= >点击跳转</ a>改成
    • <Link href=xxx><a>点击跳转</ a></Link>

    优点

    • 页面不会刷新,用AJAX请求新页面内容
    • 不会请求重复的HTML、CSS、JS
    • 自动在页面插入新内容、删除旧内容
    • 因为省了很多请求和解析过程,所以速度极快

    同构代码

    代码运行在两端

    • 在组件里写一句console.log('执行了')
    • 你会发现Node控制台会输出这句话
    • 你会发现Chrome控制台也会输出这句话

    注意差异

    • 不是所有的代码都会运行,有些需要用户触发
    • 不是所有的API都能用,比如window在Node里报错

    全局配置

    pages/_app.js

    • export default function App是每个页面的根组件
    • 页面切换时App不会销毁,App里面的组件会销毁
    • 可用App保存全局状态
    import '../styles/globals.css'
    import Head from 'next/head'
    
    function MyApp({Component, pageProps}) {
      return (
          <>
            <Head>
              {/*公共头部*/}
              <title>我的blog - kong</title>
              <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"/>
            </Head>
            <Component {...pageProps} />
          </>
      )
    }
    
    export default MyApp
    

    注意

    • 创建_app.js之后需要重启yarn dev

    全局CSS

    放在_app.js

    • import./styles/global.css
    • 因为切页面时App不会销毁
    • 其他地方不能import global.css
    • 其他地方只能写局部CSS
    import styles from '../styles/Home.module.css'
    
    export default function Home() {
      return (
          // styles module用法
          <div className={styles.container}>
            <h1>标题一</h1>
            <p>段落</p>
            
            <style jsx>{`
              h1 {
                color: red;
              }
            `}</style>
            {/*添加global,影响全局的样式*/}
            <style jsx global>{`
              body {
                background: yellow;
              }
            `}</style>
          </div>
      )
    }
    

    插曲

    • 相对引用好烦,能改成import 'styles/global.css'吗?
    • 看文档「Absolute lmports」章节
      创建jsconfig.json
    {
      "compilerOptions": {
        "baseUrl": "."
      }
    }
    

    局部CSS

    官方支持
    默认支持 styled-jsxCSS Modules
    一般来说,简单需求用前者,复杂需求用后者我的个人偏好

    其他类型文件

    图片

    • 配置file-loader
    • 或者直接用 next-images

    SVG

    • 一部分可以当作图片使用
    • icons/svg要当作SVG Symbols使用
    const nextConfig = {
      reactStrictMode: true,
      webpack: (config, options)=> {
        config.module.rules.push({
          test: '/\.(png|jpg|svg|jpeg|gif)$/',
          use: [
            {
              loader: 'file-loader',
              options: {
                name: '[name].[contenthash].[ext]',
                outputPath: 'static', // 硬盘路径
                publicPath: '_next/static' // 网站路径
              }
            }
          ]
        })
        return config
      }
    }
    
    module.exports = nextConfig
    
    • 目前没有插件,只能自己配置

    更多

    • 自己要loader,然后配置next.config.js
    • 或者看有没有人封装成next插件

    相关文章

      网友评论

          本文标题:Next.js (上)

          本文链接:https://www.haomeiwen.com/subject/kcptrrtx.html