Company Logo

Bisht Bytes

Recommended tsconfig settings For Nextjs 14

Published On: 03 Oct 2024
Reading Time: 11 minutes

Overview


Next.js 14 has introduced improvements in performance, server-side rendering, and bundling that developers should be mindful of when configuring TypeScript for their projects. The tsconfig.json file plays a critical role in setting up how TypeScript compiles, validates, and transpiles your code. Based on the sample configuration you provided, let’s break down and discuss the recommended settings for Next.js 14.

Here is the recommended configuration for tsconfig.json in your Nextjs 14 project.

{
  "compilerOptions": {
    /* Base Options: */
    "esModuleInterop": true,
    "skipLibCheck": true,
    "target": "es6",
    "allowJs": true,
    "resolveJsonModule": true,
    "moduleDetection": "force",
    "isolatedModules": true,
    "verbatimModuleSyntax": true,

    /* Transpilation */
    "jsx": "preserve",
    "moduleResolution": "node",
    "module": "esnext",
    "outDir": "./dist",
    "rootDir": "./",
    "incremental": true,
    "sourceMap": true,
    "noEmit": true,

    /* DOM api usuage */
    "lib": [
      "dom",
      "dom.iterable",
      "esnext"
    ],

    /* Code Standard */
    "strict": true,
    "noUncheckedIndexedAccess": true,
    "noImplicitOverride": true,
    "forceConsistentCasingInFileNames": true,
    "allowSyntheticDefaultImports": true,
    "noFallthroughCasesInSwitch": true,
    "strictNullChecks": true,
    "noUnusedLocals": true,
    "noImplicitAny": true,

    /* Misc */
    "plugins": [
      {
        "name": "next"
      }
    ],
    "paths": {
      "@/*": [
        "./src/*"
      ]
    },
  },
  "include": [
    "next-env.d.ts",
    "src/**/*.ts",
    "src/**/*.tsx",
    ".next/types/**/*.ts"
  ],
  "exclude": [
    "node_modules"
  ]
}

Base Compiler Options

{
  "compilerOptions": {
    /* Base Options: */
    "esModuleInterop": true,
    "skipLibCheck": true,
    "target": "es6",
    "allowJs": true,
    "resolveJsonModule": true,
    "moduleDetection": "force",
    "isolatedModules": true,
    "verbatimModuleSyntax": true,
  }
}

These settings control basic TypeScript behaviors and are critical for compatibility with Next.js and the broader JavaScript ecosystem.

  • "esModuleInterop": true
    This allows for better interoperation between CommonJS and ES modules, ensuring that TypeScript correctly resolves import statements from CommonJS libraries, a common occurrence in Node.js environments.

  • "skipLibCheck": true
    Disables type checking for .d.ts files (type declaration files). This improves compilation speed, especially in larger projects, without affecting the quality of your codebase as these types are rarely a source of issues.

  • "target": "es6"
    Specifies that TypeScript should target ECMAScript 6 (ES2015) for its output. This aligns with most modern browsers' capabilities and Next.js’s use of ES6+ syntax for optimized builds.

  • "allowJs": true
    This option enables JavaScript files to be included in the TypeScript compilation process. This is especially useful in mixed JS/TS projects where you might want to gradually migrate JavaScript files to TypeScript.

  • "resolveJsonModule": true
    Allows importing JSON files directly into your TypeScript files, an essential feature for loading configuration or data without requiring additional tooling.

  • "moduleDetection": "force"
    Ensures that TypeScript enforces module detection rules, helping to avoid ambiguous cases and guaranteeing that each file is treated as a module.

  • "isolatedModules": true
    Enforces isolated module compilation. This is crucial in Next.js because the framework handles module-based bundling, and isolated modules prevent certain TypeScript features that can cause bundling errors.

  • "verbatimModuleSyntax": true
    Enforces explicit import type and export type to maintain consistent behavior between ESM and CJS environments..

Transpilation Settings

{
  "compilerOptions": {
    /* Transpilation */
    "jsx": "preserve",
    "moduleResolution": "node",
    "module": "esnext",
    "outDir": "./dist",
    "rootDir": "./",
    "incremental": true,
    "sourceMap": true,
    "noEmit": true,
  }
}

These settings configure how TypeScript should handle JSX, modules, and output files during the compilation process.

  • "jsx": "preserve"
    Keeps JSX syntax in your TypeScript files, allowing Next.js to handle it during its own transpilation phase. This is necessary for the React components used in Next.js.

  • "moduleResolution": "node"
    TypeScript resolves modules in the same way Node.js does, making it easier to work with Node.js-style module imports. This is important for compatibility with npm packages.

  • "module": "esnext"
    Specifies that TypeScript should output ES modules. This is useful because Next.js 14 supports modern JavaScript syntax, including ES module imports and exports, for more efficient tree shaking.

  • "outDir": "./dist"
    Specifies the directory for the output files (compiled JavaScript files). However, with Next.js, you generally won’t need to directly emit files as the framework handles the build process.

  • "rootDir": "./"
    Defines the root directory for input files. This ensures that all source files are compiled relative to the project root, which is important for large projects with multiple modules.

  • "incremental": true
    Enables incremental compilation, which speeds up recompilation by reusing information from previous compilations. This is especially beneficial in larger projects where rebuilds are frequent.

  • "sourceMap": true
    Generates source maps, allowing for better debugging in development environments. Source maps help map the compiled code back to the original TypeScript files, which is essential for a smooth debugging experience.

  • "noEmit": true
    This prevents TypeScript from emitting any output files. In a Next.js project, Next.js handles the build and bundling, so you don't need TypeScript to emit JavaScript files.

DOM and API Usage

{
  "compilerOptions": {
    /* DOM api usuage */
    "lib": [
      "dom",
      "dom.iterable",
      "esnext"
    ],
  }
}

These settings ensure that TypeScript includes the necessary DOM APIs and features needed for modern web applications.

  • "lib": ["dom", "dom.iterable", "esnext"]
    By including the dom and dom.iterable libraries, you ensure that your project has access to the latest browser APIs and supports iteration over DOM elements. The inclusion of esnext ensures compatibility with the latest ECMAScript features.

Code Standards

{
  "compilerOptions": {
    /* Code Standard */
    "strict": true,
    "noUncheckedIndexedAccess": true,
    "noImplicitOverride": true,
    "forceConsistentCasingInFileNames": true,
    "allowSyntheticDefaultImports": true,
    "noFallthroughCasesInSwitch": true,
    "strictNullChecks": true,
    "noUnusedLocals": true,
    "noImplicitAny": true,
  }
}

These settings enforce stricter TypeScript rules, improving the quality and maintainability of your codebase.

  • "strict": true
    Enables all the strict type-checking options in TypeScript. This is highly recommended, as it catches many potential issues at compile time, leading to more robust code.

  • "noUncheckedIndexedAccess": true
    Ensures that accessing object properties via an index will be type-checked. This catches scenarios where properties might be missing or undefined.

  • "noImplicitOverride": true
    Requires that when you override a method in a class, you explicitly use the override keyword. This prevents unintentional method overrides that could introduce bugs.

  • "forceConsistentCasingInFileNames": true
    Enforces consistent casing in file names, which is critical for avoiding bugs, especially in environments like Linux, where file systems are case-sensitive.

  • "allowSyntheticDefaultImports": true
    Allows default imports from modules that do not have a default export, simplifying module imports for CommonJS modules.

  • "noFallthroughCasesInSwitch": true
    Prevents accidental fallthroughs in switch statements, which can lead to bugs that are hard to track down.

  • "strictNullChecks": true
    Forces you to explicitly handle null and undefined values, which can prevent a class of bugs related to unexpected null values.

  • "noUnusedLocals": true
    Ensures that unused variables are caught during compilation. This keeps the codebase clean and avoids unnecessary code bloat.

  • "noImplicitAny": true
    Disallows variables or function arguments with an implicit any type, encouraging developers to provide more specific type definitions.

Miscellaneous Settings

{
  "compilerOptions": {
    /* Misc */
    "plugins": [
      {
        "name": "next"
      }
    ],
    "paths": {
      "@/*": [
        "./src/*"
      ]
    },
  }
}

These settings provide additional flexibility and organization to the project.

  • "plugins": [{ "name": "next" }]
    The Next.js plugin integrates Next.js-specific features and optimizations into TypeScript, improving the development experience for Next.js projects.

  • "paths": Configuration
    Setting custom paths, such as @/* for the src directory, allows for cleaner and more manageable imports. This reduces the need for lengthy relative paths like ../../../components.

Include and Exclude

{
  "compilerOptions": {
    "include": [
      "next-env.d.ts",
      "src/**/*.ts",
      "src/**/*.tsx",
      ".next/types/**/*.ts"
    ],
    "exclude": [
      "node_modules"
    ]
  }
}

The include and exclude options specify which files should be included in TypeScript’s compilation process.

  • "include":
    This ensures TypeScript includes all .ts, .tsx, and environment declaration files within the src directory, as well as Next.js-specific types from the .next folder.

  • "exclude": ["node_modules"]
    This excludes the node_modules directory, as TypeScript doesn’t need to compile third-party dependencies.

Conclusion

Configuring TypeScript in a Next.js 14 project is crucial for maintaining type safety, code quality, and developer productivity. The provided configuration strikes a balance between performance, compatibility, and development experience. By following these recommendations, you can ensure a robust, scalable, and maintainable codebase while leveraging Next.js’s latest features.

Reference


Page Views: -