nextjs增加系统路径前缀(basePath)适配方案

在 Next.js 中,路由是通过文件夹结构来定义的,使用类似于 History 模式的 URL 结构。所以如果想通过nginx来代理一个nextjs开发的系统, 除非直接使用跟路径/来进行代理,否则代理将非常麻烦,这时添加basePath就非常有必要了。下面将罗列出nextjs添加前缀后需要做哪些操作来进行适配。

1.next.config.js配置修改

增加basePath配置,这里为了方便统一修改,我使用了环境变量

注意:由于 This value must be set at build time and cannot be changed without re-building as the value is inlined in the client-side bundles.(此值必须在构建时设置,如果不重新构建,则无法更改,因为该值内联在客户端捆绑包中。)所以如果不想使用.env中的环境变量,而是系统内部环境变量,那么在打包之前就应该将环境变量配置好。如果修改了此环境变量 则必须重新打包

2.静态资源路径调整

和vue项目不同,vue中可以通过在vue.config中配置publicPath来设置系统前缀,访问静态资源时将自动加上publicPath对应值作为访问前缀。在nextjs中,添加basePath后,访问public中 的静态资源时需要自己手动添加basePath对应的值作为路径前缀。

2.1 js文件:

2.2 图片:

图片添加前缀的方式和js类似,但是项目中使用静态图片的地方可能比较多,可以直接写一个方法来为图片路径添加前缀

javascript 复制代码
export const getSrcFullPath = (src?: string) => {
  const srcFullPath =
    process.env.NEXT_PUBLIC_SYSTEM_BASE_URL &&
    src?.startsWith('/') &&
    !src.startsWith(process.env.NEXT_PUBLIC_SYSTEM_BASE_URL)
      ? (process.env.NEXT_PUBLIC_SYSTEM_BASE_URL || '') + src
      : src;
  return srcFullPath;
};

2.3 其他静态文件参考js和图片即可。

3.路由路径调整

3.1 如果是通过Link组件的href属性进行路由的跳转,则组件的href属性需要加上配置的前缀

3.2 如果是通过router.push/replace方法进行路由的切换,则传入router.push中的path配置不用修改,即不用添加前缀信息,跳转后的地址默认会包含前缀(通过router.push方法进行路由跳转时一定不要加basePath前缀,加上后会反而会多拼接一次前缀路径导致地址错误)

4.内部接口增加前缀

如果使用了nextjs的Route Handlers来定义自定义接口,那么在访问接口时也需要加上前缀地址,一般情况下,我们会使用二次封装的axios来发送请求,这里也在封装文件中统一添加前缀地址

5.外部接口本地调试调整

除了内部接口,如果还需要访问外部接口,通常需要通过代理设置来解决浏览器请求跨域问题,在nextjs中通过设置next.config.js配置文件中的rewrites属性来实现代理,如图

但是添加basePath,本地调试时再次访问外部接口会直接报错404。

猜想next.config.js中添加basePath后,访问外部接口时接口路径为http://localhost:3000/database/page,此时并没有匹配到添加前缀后的nextjs环境,自然也不会进入到next.config.js中的rewrites代理配置。所以在开发环境,也需要为外部接口添加前缀。添加前缀后方能进入到next.config中的代理(next.config中的rewrites属性无需修改)

相关推荐
q***498611 分钟前
MySQL数据的增删改查(一)
android·javascript·mysql
我有一个object11 分钟前
uniapp上传文件报错:targetSdkVersion设置>=29后在Android10+系统设备不支持当前路径。请更改为应用运行路径!
前端·javascript·vue.js·uniapp
北极糊的狐16 分钟前
关于jQuery 事件绑定,记录常用事件类型及核心注意事项
前端·javascript·jquery
星空的资源小屋17 分钟前
极速精准!XSearch本地文件搜索神器
javascript·人工智能·django·电脑
_Kayo_22 分钟前
vue3 computed 练习笔记
前端·vue.js·笔记
CodeSheep25 分钟前
VS 2026 正式发布,王炸!
前端·后端·程序员
无奈何杨26 分钟前
CoolGuard事件查询增加策略和规则筛选,条件结果展示
前端·后端
梦里不知身是客1129 分钟前
正则表达式常见的介绍
前端·javascript·正则表达式
初学小白...1 小时前
HTML知识点
前端·javascript·html
鹏多多1 小时前
flutter睡眠与冥想数据可视化神器:sleep_stage_chart插件全解析
android·前端·flutter