7a8da9741d
add `experimental.esmExternals: boolean | 'loose'` config option remove `output.environment` configuration in favor of `target` | | `esmExternals: false` (default) | `esmExternals: 'loose'` | `esmExternals: true` | | ------------------------ | ------------------------------- | ----------------------- | -------------------- | | import cjs package | `require()` | `require()` | `require()` | | require cjs package | `require()` | `require()` | `require()` | | import mixed package | `require()` *** | `import()` | `import()` | | require mixed package | `require()` | `require()` | `require()` | | import pure esm package | `import()` | `import()` | `import()` | | require pure esm package | Error ** | `import()` * | Error ** | | import pure cjs package | `require()` | `require()` | Resolving error | | require pure cjs package | `require()` | `require()` | `require()` | cjs package: Offers only CJS implementation (may not even have an `exports` field) mixed package: Offers CJS and ESM implementation via `exports` field pure esm package: Only offers an ESM implementation (may not even have an `exports` field) pure cjs package: CommonJs package that prevents importing via `exports` field when `import` is used. `*` This case will behave a bit unexpected for now, since `require` will return a Promise. So that need to be awaited. This will be fixed once the whole next.js bundle is ESM. It didn't work at all before this PR. `**` This is a new Error when trying to require an esm package. `***` For mixed packages we prefer the CommonJS variant to avoid a breaking change. ## Feature - [ ] Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR. - [ ] Related issues linked using `fixes #number` - [x] Integration tests added - [ ] Documentation added - [ ] Telemetry added. In case of a feature if it's used or not. - [x] Errors have helpful link attached, see `contributing.md` ## Documentation / Examples - [ ] Make sure the linting passes
59 lines
2.1 KiB
TypeScript
59 lines
2.1 KiB
TypeScript
import isWslBoolean from 'next/dist/compiled/is-wsl'
|
|
import curry from 'next/dist/compiled/lodash.curry'
|
|
import { webpack, isWebpack5 } from 'next/dist/compiled/webpack/webpack'
|
|
import { ConfigurationContext } from '../utils'
|
|
|
|
const isWindows = process.platform === 'win32' || isWslBoolean
|
|
|
|
export const base = curry(function base(
|
|
ctx: ConfigurationContext,
|
|
config: webpack.Configuration
|
|
) {
|
|
config.mode = ctx.isDevelopment ? 'development' : 'production'
|
|
config.name = ctx.isServer ? 'server' : 'client'
|
|
if (isWebpack5) {
|
|
// @ts-ignore TODO webpack 5 typings
|
|
config.target = ctx.isServer ? 'node12.17' : ['web', 'es5']
|
|
} else {
|
|
config.target = ctx.isServer ? 'node' : 'web'
|
|
}
|
|
|
|
// Stop compilation early in a production build when an error is encountered.
|
|
// This behavior isn't desirable in development due to how the HMR system
|
|
// works, but is a good default for production.
|
|
config.bail = ctx.isProduction
|
|
|
|
// https://webpack.js.org/configuration/devtool/#development
|
|
if (ctx.isDevelopment) {
|
|
if (process.env.__NEXT_TEST_MODE && !process.env.__NEXT_TEST_WITH_DEVTOOL) {
|
|
config.devtool = false
|
|
} else if (isWindows) {
|
|
// Non-eval based source maps are slow to rebuild, so we only enable
|
|
// them for Windows. Unfortunately, eval source maps are flagged as
|
|
// suspicious by Windows Defender and block HMR.
|
|
config.devtool = 'inline-source-map'
|
|
} else {
|
|
// `eval-source-map` provides full-fidelity source maps for the
|
|
// original source, including columns and original variable names.
|
|
// This is desirable so the in-browser debugger can correctly pause
|
|
// and show scoped variables with their original names.
|
|
config.devtool = 'eval-source-map'
|
|
}
|
|
} else {
|
|
// Enable browser sourcemaps:
|
|
if (ctx.productionBrowserSourceMaps && ctx.isClient) {
|
|
config.devtool = 'source-map'
|
|
} else {
|
|
config.devtool = false
|
|
}
|
|
}
|
|
|
|
if (!config.module) {
|
|
config.module = { rules: [] }
|
|
}
|
|
|
|
// TODO: add codemod for "Should not import the named export" with JSON files
|
|
config.module.strictExportPresence = !isWebpack5
|
|
|
|
return config
|
|
})
|