nextjs 笔记
Static Generation with Data using getStaticProps
export default function Home(props) { ... }export async function getStaticProps() {// Get external data from the file system, API, DB, etc.const data = ...// The value of the `props` key will be// passed to the `Home` componentreturn {props: ...}}
Server-side Rendering
you need to export getServerSideProps instead of getStaticProps from your page
export async function getServerSideProps(context) {return {props: {// props for your component}}}
Static File Serving 静态文件
Next.js可以在根目录下的文件夹public下提供静态文件(例如图片)。 代码中你可以以(/)开始引用public下的文件。
例如添加 public/my-image.png 这个图片
<img src="/my-image.png" alt="my image" />
This folder is also useful for robots.txt, favicon.ico, Google Site Verification, and any other static files (including .html)!
import image
nextjs 不支持直接import image 需要安装 next-optimized-images 或者 next-images; 并且配置next.config.js
import ab from "../assets/ab.jpg"console.log(ab)// ab 为图片url/_next/static/images/ab-3fb8017e0db6fb938d1a1007ef227d86.jpg最新的next 11 版本支持直接import 图片:import LogoImage from '~/assets/images/bim-logo.png';console.log(LogoImage){src: "/_next/static/image/assets/images/bim-logo.cfexxxx9.png",height: 702,width: 2252,blurDataURL: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgA…+/RXjYWL48wIo+RyImQAXARzogUBDGwAAAABJRU5ErkJggg=="}gatsby 和 react 支持直接import image
改变运行端口 -p 端口
更改package.json 的 scripts
"dev": "next dev -p 3200",
部署nextjs 到服务器上
如果使用了typestript,要在服务器上安装 typescriptnpm install typescript -g先cd 到next项目根目录 build 项目yarn build然后NODE_ENV=production PORT=5010 pm2 start npm --name "component.90m.top" -- run start然后配置nginx 端口到next 启动的端口如package.json里面的 scripts.start 端口配置 5010"scripts": {"dev": "PORT=5010 next dev","build": "next build","start": "PORT=5010 next start",},具体配置如下:(删除oneinstack 里面默认生成的其他 图片或者 js的nginx规则)location / {proxy_pass http://127.0.0.1:5010;proxy_http_version 1.1;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto https;proxy_connect_timeout 300;proxy_send_timeout 300;proxy_read_timeout 300;send_timeout 300;}location ^~ /.well-known/acme-challenge/ {default_type "text/plain";root /data/wwwroot/component.90m.top/;}
Why are destructured environment variables undefined in Next.js
const { API_KEY } = process.env; // = undefinedconst key = process.env.API_KEY; // = 'value'In order to keep server-only secrets safe, Next.js replaces process.env.* with the correct values at build time. This means that process.env is not a standard JavaScript object, so you’re not able to use object destructuring.// client-side React componentsThe value will be inlined into JavaScript sent to the browser because of the NEXT_PUBLIC_ prefix. This inlining occurs at build time, so your various NEXT_PUBLIC_ envs need to be set when the project is built
配置文件注意点 next.config.js
Next.js provide a transpileModules option in its configuration to specify which modules should be transpiled by Babel.
借助 babel 的转换,es6 的模块最终还是会转换成 commonjs 规范的模块。
使用 antd 时报错如下:import InternalCard from './Card';^^^^^^SyntaxError: Cannot use import statement outside a module需要配置 transpilePackages属性,数组中加上 antd 及其依赖的相关模块;module.exports = {transpilePackages: ["antd","rc-util",// "@babel/runtime","@ant-design/icons","@ant-design/icons-svg","rc-pagination","rc-picker","rc-tree","rc-table",],}
nextjs 取消部署时检查 typescript 格式
next.config.jsmodule.exports = {typescript: {// !! WARN !!// Dangerously allow production builds to successfully complete even if// your project has type errors.// !! WARN !!ignoreBuildErrors: true,},}