如何在 NextJs 项目中获取页面 URL 或主机名?

IT技术 reactjs next.js hostname domain-name base-url
2021-05-20 13:00:53

我想在静态站点生成器上获取页面的完整 URL 或站点主机名,如下图所示。

我会尝试window.location.hostname,但它不起作用。

错误:窗口未定义。

在此处输入图片说明

4个回答

如果您想要服务器端 getInitialProps 中的主机名,您仍然可以从 req 中获取它

Home.getInitialProps = async(context) => {
   const { req, query, res, asPath, pathname } = context;
   if (req) {
      let host = req.headers.host // will give you localhost:3000
     }
  }

您访问的地方window确保您添加了一个检查,以便代码仅在浏览器上执行,而在 SSG 期间不执行”

if (typeof window !== 'undefined') {
   const hostname = window.location.hostname;
}

更新:如果您已指定basePathnext.config.js

module.exports = {
  basePath: 'https://www.example.com/docs',
}

然后使用useRouter,您可以访问基本路径:

import { useRouter } from 'next/router'

function Component() {
   const router = useRouter();
   
   console.log({ basePath: router.basePath}); 
   // { basePath: 'https://www.example.com/docs' }

   ...
}

但是如果你有一个相对的基本路径,那么你可以使用第一种方法

使用typeof window !== 'undefined'是安全的方式。if (window) {}会让你遇到问题。

const hostname = typeof window !== 'undefined' && window.location.hostname ? window.location.hostname : '';
const origin = typeof window !== 'undefined' && window.location.origin ? window.location.origin : '';

使用上面的代码将为您提供前端/外部主机名/客户端使用的来源:example.com, 等www.example.comwww.example.com:80而不是这些localhost东西。useRouter()将返回服务器端主机名/来源 ( localhost, localhost:3000)

考虑这个包> next-absolute-url

import absoluteUrl from 'next-absolute-url'
const { origin } = absoluteUrl(req)
const apiURL = `${origin}/api/job.js`

如果您现在部署了 Next.js 应用程序,则 apiURL 将类似于https://your-app.now.sh/api/job.js.

但是,如果您在本地运行应用程序,则 apiURL 将http://localhost:8000/api/job.js改为。