refactor(babel-preset-app): simplify babel preset config (#6087)

This commit is contained in:
Xin Du (Clark) 2019-09-03 20:36:54 +01:00 committed by Pooya Parsa
parent f6ca2c77ed
commit 2fc73cf119
3 changed files with 55 additions and 41 deletions

View File

@ -21,7 +21,7 @@ Usually, no additional configuration is required. If needed though, there is an
```js ```js
babel: { babel: {
presets({ isServer }) { presets(env, [ preset, options ]) {
return [ return [
[ "@nuxt/babel-preset-app", options ] [ "@nuxt/babel-preset-app", options ]
] ]
@ -29,6 +29,10 @@ babel: {
} }
``` ```
`env` is an object which contains `envName` (`server`, `client`, `modern`) and all `nuxtEnv` properties (`isDev`, `isServer`, `isClient`, `isModern`, `isLegacy`)
`preset` is the preset package name `@nuxt/babel-preset-app`
`options` is an object with parameters, for example: `options` is an object with parameters, for example:
```js ```js
@ -37,11 +41,10 @@ const options = {
} }
``` ```
Below is a list of all available parameters: Below is a list of all available `options` parameters:
### Options ### Options
* **buildTarget** - passed in through the Builder, either `"server"` or `"client"`
* **configPath** - [`@babel/preset-env` parameter](https://babeljs.io/docs/en/babel-preset-env#configpath) * **configPath** - [`@babel/preset-env` parameter](https://babeljs.io/docs/en/babel-preset-env#configpath)
* **forceAllTransforms** - '[@babel/preset-env](https://babeljs.io/docs/en/babel-preset-env#forcealltransforms)' parameter * **forceAllTransforms** - '[@babel/preset-env](https://babeljs.io/docs/en/babel-preset-env#forcealltransforms)' parameter
* **debug**, default `false` - '[@babel/preset-env](https://babeljs.io/docs/en/babel-preset-env#debug)' parameter * **debug**, default `false` - '[@babel/preset-env](https://babeljs.io/docs/en/babel-preset-env#debug)' parameter
@ -50,9 +53,8 @@ Below is a list of all available parameters:
* **exclude** - '[@babel/preset-env](https://babeljs.io/docs/en/babel-preset-env#exclude)' parameter * **exclude** - '[@babel/preset-env](https://babeljs.io/docs/en/babel-preset-env#exclude)' parameter
* **ignoreBrowserslistConfig**, defaults to value of `modern` - '[@babel/preset-env](https://babeljs.io/docs/en/babel-preset-env#ignorebrowserslistconfig)' parameter * **ignoreBrowserslistConfig**, defaults to value of `modern` - '[@babel/preset-env](https://babeljs.io/docs/en/babel-preset-env#ignorebrowserslistconfig)' parameter
* **include** - '[@babel/preset-env](https://babeljs.io/docs/en/babel-preset-env#include)' parameter * **include** - '[@babel/preset-env](https://babeljs.io/docs/en/babel-preset-env#include)' parameter
* **jsx**, default truish, can be a an object passed as params to [@vue/babel-preset-jsx`](https://www.npmjs.com/package/@vue/babel-preset-jsx) * **jsx**, default true, can be a an object passed as params to [@vue/babel-preset-jsx`](https://www.npmjs.com/package/@vue/babel-preset-jsx)
* **loose**, default `false` - '[@babel/preset-env](https://babeljs.io/docs/en/babel-preset-env#loose)' parameter and also sets `loose=true` for `@babel/plugin-proposal-class-properties` * **loose**, default `false` - '[@babel/preset-env](https://babeljs.io/docs/en/babel-preset-env#loose)' parameter and also sets `loose=true` for `@babel/plugin-proposal-class-properties`
* **modern** passed by builder, either `true` or `false`
* **modules**, default `false` - '[@babel/preset-env](https://babeljs.io/docs/en/babel-preset-env#modules)' parameter * **modules**, default `false` - '[@babel/preset-env](https://babeljs.io/docs/en/babel-preset-env#modules)' parameter
* **polyfills**, default `core-js@2: ['es6.array.iterator','es6.promise','es6.object.assign','es7.promise.finally']`, `core-js@3: ['es.array.iterator','es.promise','es.object.assign','es.promise.finally']`, more [in the corresponding repository](https://github.com/zloirock/core-js) * **polyfills**, default `core-js@2: ['es6.array.iterator','es6.promise','es6.object.assign','es7.promise.finally']`, `core-js@3: ['es.array.iterator','es.promise','es.object.assign','es.promise.finally']`, more [in the corresponding repository](https://github.com/zloirock/core-js)
* **shippedProposals** - '[@babel/preset-env](https://babeljs.io/docs/en/babel-preset-env#shippedproposals)' parameter * **shippedProposals** - '[@babel/preset-env](https://babeljs.io/docs/en/babel-preset-env#shippedproposals)' parameter
@ -69,14 +71,16 @@ There are [detailed docs](https://babeljs.io/docs/en/babel-preset-env#options) f
export default { export default {
build: { build: {
babel: { babel: {
presets({ isServer }) { presets({ envName }) {
const envTargets = {
client: { browsers: ["last 2 versions"], ie: 11 },
server: { node: "current" },
}
return [ return [
[ [
"@nuxt/babel-preset-app", "@nuxt/babel-preset-app",
{ {
targets: isServer targets: envTargets[envName]
? { node: "current" }
: { browsers: ["last 2 versions"], ie: 11 }
} }
] ]
] ]
@ -98,12 +102,12 @@ yarn add --dev core-js@2 @babel/runtime-corejs2
export default { export default {
build: { build: {
babel: { babel: {
presets({ isServer }) { // envName: server, client, modern
presets({ envName }) {
return [ return [
[ [
require.resolve('@nuxt/babel-preset-app'), '@nuxt/babel-preset-app',
{ {
buildTarget: isServer ? 'server' : 'client',
corejs: { version: 3 } corejs: { version: 3 }
} }
] ]

View File

@ -43,23 +43,20 @@ function getPolyfills (targets, includes, { ignoreBrowserslistConfig, configPath
return includes.filter(item => isPluginRequired(builtInTargets, builtInsList[item])) return includes.filter(item => isPluginRequired(builtInTargets, builtInsList[item]))
} }
module.exports = (context, options = {}) => { module.exports = (api, options = {}) => {
const presets = [] const presets = []
const plugins = [] const plugins = []
const modern = options.modern === undefined const envName = api.env()
? context.env('modern')
: Boolean(options.modern)
const { const {
polyfills: userPolyfills, polyfills: userPolyfills,
buildTarget,
loose = false, loose = false,
debug = false, debug = false,
useBuiltIns = 'usage', useBuiltIns = 'usage',
modules = false, modules = false,
spec, spec,
ignoreBrowserslistConfig = modern, ignoreBrowserslistConfig = envName === 'modern',
configPath, configPath,
include, include,
exclude, exclude,
@ -76,23 +73,34 @@ module.exports = (context, options = {}) => {
corejs = { version: Number(corejs) } corejs = { version: Number(corejs) }
} }
let { targets } = options const defaultTargets = {
if (modern === true) { server: { node: 'current' },
targets = { esmodules: true } client: { ie: 9 },
} else if (targets === undefined && typeof buildTarget === 'string') { modern: { esmodules: true }
targets = buildTarget === 'server' ? { node: 'current' } : { ie: 9 }
} }
let polyfills let { targets = defaultTargets[envName] } = options
if (modern === false && useBuiltIns === 'usage' && buildTarget === 'client') {
polyfills = getPolyfills(targets, userPolyfills || getDefaultPolyfills(corejs), { // modern mode can only be { esmodules: true }
ignoreBrowserslistConfig, if (envName === 'modern') {
configPath, targets = defaultTargets.modern
corejs }
})
const polyfills = []
if (envName === 'client' && useBuiltIns === 'usage') {
polyfills.push(
...getPolyfills(
targets,
userPolyfills || getDefaultPolyfills(corejs),
{
ignoreBrowserslistConfig,
configPath,
corejs
}
)
)
plugins.push([require('./polyfills-plugin'), { polyfills }]) plugins.push([require('./polyfills-plugin'), { polyfills }])
} else {
polyfills = []
} }
// Pass options along to babel-preset-env // Pass options along to babel-preset-env
@ -132,7 +140,7 @@ module.exports = (context, options = {}) => {
regenerator: useBuiltIns !== 'usage', regenerator: useBuiltIns !== 'usage',
corejs: false, corejs: false,
helpers: useBuiltIns === 'usage', helpers: useBuiltIns === 'usage',
useESModules: buildTarget !== 'server', useESModules: envName !== 'server',
absoluteRuntime absoluteRuntime
}]) }])

View File

@ -80,24 +80,26 @@ export default class WebpackBaseConfig {
} }
getBabelOptions () { getBabelOptions () {
const envName = this.name
const options = { const options = {
...this.buildContext.buildOptions.babel, ...this.buildContext.buildOptions.babel,
envName: this.name envName
} }
if (options.configFile !== false) { if (options.configFile !== false) {
return options return options
} }
const defaultPreset = [ const defaultPreset = [ require.resolve('@nuxt/babel-preset-app'), {} ]
require.resolve('@nuxt/babel-preset-app'),
{
buildTarget: this.isServer ? 'server' : 'client'
}
]
if (typeof options.presets === 'function') { if (typeof options.presets === 'function') {
options.presets = options.presets({ isServer: this.isServer }, defaultPreset) options.presets = options.presets(
{
envName,
...this.nuxtEnv
},
defaultPreset
)
} }
if (!options.babelrc && !options.presets) { if (!options.babelrc && !options.presets) {