Next.js的next.config.ts与next.config.mjs的区别

最近在做Next.js项目的时候,按照react的流程给它做一个跨域的请求封装,本以为会像传统React项目那样顺风顺水!!接下来我将以我做配置代理的例子作介绍。希望大家看完文章后,避开我所遇上的问题。

先说结论:Next.js 默认不支持 next.config.ts 配置文件,只支持 next.config.jsnext.config.mjs。因此,要在 TypeScript 项目中使用配置文件,需要使用 next.config.jsnext.config.mjs,并在其中导入 TypeScript 代码或使用 JavaScript 编写配置。

1. next.config.js

  • 适用场景: 这是最常用的配置文件类型,适用于大多数项目。它使用 CommonJS 语法,简单易用。

  • /** @type {import('next').NextConfig} */
    const nextConfig = {
      reactStrictMode: true,
      async rewrites() {
        return [
          {
            source: '/api/:path*',
            destination: `${process.env.NEXT_PUBLIC_API_BASE_URL}:path*`, // 代理到后端 API 服务器
          },
        ];
      },
    };
    module.exports = nextConfig;
    

2. next.config.mjs

  • 适用场景: 如果你希望在配置文件中使用 ES Module 语法(importexport),可以使用这个文件类型。

  • /** @type {import('next').NextConfig} */
    const nextConfig = {
      reactStrictMode: true,
      async rewrites() {
        return [
          {
            source: '/api/:path*',
            destination: `${process.env.NEXT_PUBLIC_API_BASE_URL}:path*`, // 代理到后端 API 服务器
          },
        ];
      },
    };
    
    export default nextConfig;
    

选择一种并保持一致

在一个项目中,只需要选择其中一种配置文件类型,并且确保全局使用该类型。例如,如果你选择了 next.config.js,就不要再使用 next.config.tsnext.config.mjs。这样可以避免冲突和混淆,确保配置文件的清晰性和项目的稳定性。

可能的影响

  • 配置文件冲突: 如果同时存在多个配置文件类型,Next.js 可能会优先加载其中一个文件,其他配置文件可能会被忽略,从而导致配置不一致或错误。
  • 维护复杂性: 多个配置文件类型可能会增加项目的维护复杂性,特别是当不同的团队成员对不同文件进行修改时,可能会导致混乱。

我配置了sass,并且开发语言是ts,然后需要为它配置 include 路径,所以我认为vite是识别不到.js类型的文件的,然后改成next.config.ts。但是某种机缘巧合下,sass的配置是生效的!这让我对我的配置文件深信不疑。但是当我配置代理时,理所应当的是在next.config.ts里面配置。它是不可能生效的。所以一波三折后这篇文章出现了。至于为什么next.config.ts的sassOptions是生效的,我不打算了理睬了。最后这是我的next.config.mjs文件。

/** @type {import('next').NextConfig} */

import path from 'path';
import { fileURLToPath } from 'url';

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

const nextConfig = {
  // @link https://nextjs.org/docs/app/api-reference/next-config-js/headers
  reactStrictMode: true,
  async rewrites() {
    return [
      {
        source: '/api/:path*',
        destination: `${process.env.NEXT_PUBLIC_API_BASE_URL}:path*`, // 代理到后端 API 服务器
      },
    ];
  },
  sassOptions: {
    includePaths: [path.join(__dirname, 'styles')],
  },
};

export default nextConfig;

这个错误也是纠缠了我好久!我一直认为是我配置的跨域有问题,因为之前对next的特性不熟悉,以为它有什么特殊的跨域方法。学习就该如此!不断学习不断积累,加油!!

### OmegaConf 配置管理简介 OmegaConf 是一个强大的 Python 库,用于处理复杂的配置文件。它支持多种数据结构(如字典、列表)以及 YAML 文件的解析和操作。以下是有关如何使用 OmegaConf 的详细介绍。 #### 创建配置对象 可以通过 `OmegaConf.create` 方法创建一个新的配置对象。该方法可以接受字典、YAML 字符串或其他兼容的数据结构作为输入[^1]。 ```python import omegaconf from omegaconf import OmegaConf config_dict = {"database": {"host": "localhost", "port": 6379}} config = OmegaConf.create(config_dict) print(OmegaConf.to_yaml(config)) # 将配置转换为 YAML 格式的字符串 ``` #### 加载外部 YAML 文件 如果需要加载外部 YAML 文件,可使用 `OmegaConf.load` 方法。这使得程序能够轻松读取并应用存储在磁盘上的配置文件。 ```python yaml_file_path = "./example_config.yaml" file_conf = OmegaConf.load(yaml_file_path) # 打印加载后的配置内容 print(file_conf.database.host) # 输出 'localhost' ``` #### 合并多个配置源 当存在多个配置来源时(例如默认设置命令行参数),可以使用 `OmegaConf.merge` 来无缝合并它们。此功能允许开发者优先级较高的配置覆盖较低级别的配置项。 ```python default_configs = OmegaConf.create({"model": {"type": "resnet50"}}) cli_args = OmegaConf.from_dotlist(["model.type=vgg16"]) merged_config = OmegaConf.merge(default_configs, cli_args) assert merged_config.model.type == "vgg16" # 命令行参数成功覆盖默认值 ``` #### 动态更新配置 除了静态定义外,还可以通过访问器动态修改现有配置中的字段。这种灵活性非常适合运行时调整某些超参数或环境变量。 ```python dynamic_update = file_conf.copy() dynamic_update.database.port = 8080 print(dynamic_update.database.port) # 输出新的端口号 8080 ``` #### 错误处理机制 为了防止非法赋值破坏整个系统的稳定性,OmegaConf 提供了严格的模式控制选项。启用严格模式后,任何未声明过的键都将引发异常提示用户修正错误。 ```python strict_mode_enabled = file_conf.copy() strict_mode_enabled.set_struct(True) # 开启只读保护状态 try: strict_mode_enabled.new_field = True # 此处会抛出 AttributeError 异常 except AttributeError as e: print(f"Catch expected error: {e}") ``` --- ### 总结 以上展示了 OmegaConf 在不同场景下的典型用法,包括但不限于初始化配置实例、加载外部资源、融合多层设定逻辑以及实施安全防护措施等方面的功能特性。希望这些例子能帮助快速掌握其核心概念和技术要点!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值