https://nextjs.org/blog/next-9#built-in-zero-config-typescript-support
Create shared directory in project’s root directory
Under shared directory, create randomizer.ts:
export function randomizer() {
return 4;
}
Create deeply/nested directories under components directory
Under components/deeply/nested directory, create SampleComponent.tsx:
import React from "react";
// import { randomizer } from "../../../shared/randomizer";
import { randomizer } from "love/randomizer";
export function SampleComponent() {
const a = randomizer();
return (
<div>
<strong>I am strong {a}</strong>
</div>
);
}
Edit pages/index.tsx, then add SampleComponent, e.g.,
<p className="description">
To get started, edit <code>pages/index.js</code> and save to
reload.
</p>
<SampleComponent />
Add this import statement to pages/index.tsx:
import { SampleComponent } from "../components/deeply/nested/SampleComponent";
Edit tsconfig.json and add the following under compilerOptions:
"baseUrl": ".",
"paths": {
"love/*": ["shared/*"]
}
Webpack must be informed of TypeScript’s paths, this can be done by modifying webpack’s resolve.alias object. To modify webpack’s configuration, create next.config.js in project’s root directory, then put the following:
const path = require("path");
module.exports = {
webpack(config, { dev }) {
config.resolve.alias = {
...config.resolve.alias,
love: path.resolve(__dirname, "shared")
};
return config;
}
};
Run yarn dev, everything shall work.
To avoid manual synchronization of tsconfig’s paths and webpack’s resolve.alias, use the following helper: (sourced from: https://gist.github.com/nerdyman/2f97b24ab826623bff9202750013f99e)
Create resolve-tsconfig-path-to-webpack-alias.js in project's root directory:
const { resolve } = require('path');
/**
* Resolve tsconfig.json paths to Webpack aliases
* @param {string} tsconfigPath - Path to tsconfig
* @param {string} webpackConfigBasePath - Path from tsconfig to Webpack config to create absolute aliases
* @return {object} - Webpack alias config
*/
function resolveTsconfigPathsToAlias({
tsconfigPath = './tsconfig.json',
webpackConfigBasePath = __dirname,
} = {}) {
const { paths } = require(tsconfigPath).compilerOptions;
const aliases = {};
Object.keys(paths).forEach((item) => {
const key = item.replace('/*', '');
const value = resolve(webpackConfigBasePath, paths[item][0].replace('/*', '').replace('*', ''));
aliases[key] = value;
});
return aliases;
}
module.exports = resolveTsconfigPathsToAlias;
Change next.config.js to following:
const path = require("path");
const resolveTsconfigPathsToAlias = require("./resolve-tsconfig-path-to-webpack-alias");
module.exports = {
webpack(config, { dev }) {
config.resolve.alias = {
...config.resolve.alias,
...resolveTsconfigPathsToAlias()
};
return config;
}
};
Run yarn dev, everything shall work.
Sample working code: https://github.com/ienablemuch/experiment-react-nextjs-typescript-absolute-import