Skip to content
This repository has been archived by the owner on Apr 6, 2023. It is now read-only.

feat: allow disabling sourcemap generation #4509

Merged
merged 6 commits into from
Apr 22, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 2 additions & 2 deletions packages/nuxt/src/auto-imports/module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,8 +74,8 @@ export default defineNuxtModule<Partial<AutoImportsOptions>>({
})
} else {
// Transform to inject imports in production mode
addVitePlugin(TransformPlugin.vite({ ctx, options }))
addWebpackPlugin(TransformPlugin.webpack({ ctx, options }))
addVitePlugin(TransformPlugin.vite({ ctx, options, sourcemap: nuxt.options.sourcemap }))
addWebpackPlugin(TransformPlugin.webpack({ ctx, options, sourcemap: nuxt.options.sourcemap }))
}

const regenerateAutoImports = async () => {
Expand Down
4 changes: 2 additions & 2 deletions packages/nuxt/src/auto-imports/transform.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { parseQuery, parseURL } from 'ufo'
import { Unimport } from 'unimport'
import { AutoImportsOptions } from '@nuxt/schema'

export const TransformPlugin = createUnplugin(({ ctx, options }: {ctx: Unimport, options: Partial<AutoImportsOptions> }) => {
export const TransformPlugin = createUnplugin(({ ctx, options, sourcemap }: {ctx: Unimport, options: Partial<AutoImportsOptions>, sourcemap?: boolean }) => {
return {
name: 'nuxt:auto-imports-transform',
enforce: 'post',
Expand Down Expand Up @@ -39,7 +39,7 @@ export const TransformPlugin = createUnplugin(({ ctx, options }: {ctx: Unimport,
}
return {
code,
map: s.generateMap({ source: id, includeContent: true })
map: sourcemap && s.generateMap({ source: id, includeContent: true })
}
}
}
Expand Down
83 changes: 41 additions & 42 deletions packages/nuxt/src/components/loader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { pascalCase } from 'scule'
interface LoaderOptions {
getComponents(): Component[]
mode: 'server' | 'client'
sourcemap?: boolean
}

export const loaderPlugin = createUnplugin((options: LoaderOptions) => ({
Expand All @@ -22,7 +23,46 @@ export const loaderPlugin = createUnplugin((options: LoaderOptions) => ({
return pathname.endsWith('.vue') && (query.type === 'template' || !!query.macro || !search)
},
transform (code, id) {
return transform(code, id, options.getComponents(), options.mode)
const components = options.getComponents()

let num = 0
const imports = new Set<string>()
const map = new Map<Component, string>()
const s = new MagicString(code)

// replace `_resolveComponent("...")` to direct import
s.replace(/(?<=[ (])_?resolveComponent\(["'](lazy-|Lazy)?([^'"]*?)["']\)/g, (full, lazy, name) => {
const component = findComponent(components, name, options.mode)
if (component) {
const identifier = map.get(component) || `__nuxt_component_${num++}`
map.set(component, identifier)
const isClientOnly = component.mode === 'client'
if (isClientOnly) {
imports.add(genImport('#app/components/client-only', [{ name: 'createClientOnly' }]))
}
if (lazy) {
imports.add(genImport('vue', [{ name: 'defineAsyncComponent', as: '__defineAsyncComponent' }]))
imports.add(`const ${identifier}_lazy = __defineAsyncComponent(${genDynamicImport(component.filePath)})`)
return isClientOnly ? `createClientOnly(${identifier}_lazy)` : `${identifier}_lazy`
} else {
imports.add(genImport(component.filePath, [{ name: component.export, as: identifier }]))
return isClientOnly ? `createClientOnly(${identifier})` : identifier
}
}
// no matched
return full
})

if (imports.size) {
s.prepend([...imports, ''].join('\n'))
}

if (s.hasChanged()) {
return {
code: s.toString(),
map: options.sourcemap && s.generateMap({ source: id, includeContent: true })
}
}
}
}))

Expand All @@ -34,44 +74,3 @@ function findComponent (components: Component[], name: string, mode: LoaderOptio
}
return component
}

function transform (code: string, id: string, components: Component[], mode: LoaderOptions['mode']) {
let num = 0
const imports = new Set<string>()
const map = new Map<Component, string>()
const s = new MagicString(code)

// replace `_resolveComponent("...")` to direct import
s.replace(/(?<=[ (])_?resolveComponent\(["'](lazy-|Lazy)?([^'"]*?)["']\)/g, (full, lazy, name) => {
const component = findComponent(components, name, mode)
if (component) {
const identifier = map.get(component) || `__nuxt_component_${num++}`
map.set(component, identifier)
const isClientOnly = component.mode === 'client'
if (isClientOnly) {
imports.add(genImport('#app/components/client-only', [{ name: 'createClientOnly' }]))
}
if (lazy) {
imports.add(genImport('vue', [{ name: 'defineAsyncComponent', as: '__defineAsyncComponent' }]))
imports.add(`const ${identifier}_lazy = __defineAsyncComponent(${genDynamicImport(component.filePath)})`)
return isClientOnly ? `createClientOnly(${identifier}_lazy)` : `${identifier}_lazy`
} else {
imports.add(genImport(component.filePath, [{ name: component.export, as: identifier }]))
return isClientOnly ? `createClientOnly(${identifier})` : identifier
}
}
// no matched
return full
})

if (imports.size) {
s.prepend([...imports, ''].join('\n'))
}

if (s.hasChanged()) {
return {
code: s.toString(),
map: s.generateMap({ source: id, includeContent: true })
}
}
}
2 changes: 2 additions & 0 deletions packages/nuxt/src/components/module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ export default defineNuxtModule<ComponentsOptions>({
nuxt.hook('vite:extendConfig', (config, { isClient }) => {
config.plugins = config.plugins || []
config.plugins.push(loaderPlugin.vite({
sourcemap: nuxt.options.sourcemap,
getComponents,
mode: isClient ? 'client' : 'server'
}))
Expand All @@ -140,6 +141,7 @@ export default defineNuxtModule<ComponentsOptions>({
configs.forEach((config) => {
config.plugins = config.plugins || []
config.plugins.push(loaderPlugin.webpack({
sourcemap: nuxt.options.sourcemap,
getComponents,
mode: config.name === 'client' ? 'client' : 'server'
}))
Expand Down
1 change: 1 addition & 0 deletions packages/nuxt/src/core/nitro.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ export async function initNitro (nuxt: Nuxt) {
.concat(nuxt.options._generate ? ['/', ...nuxt.options.generate.routes] : [])
.concat(nuxt.options.ssr === false ? ['/', '/200', '/404'] : [])
},
sourcemap: nuxt.options.sourcemap,
externals: {
inline: [
...(nuxt.options.dev ? [] : ['vue', '@vue/', '@nuxt/', nuxt.options.buildDir]),
Expand Down
4 changes: 2 additions & 2 deletions packages/nuxt/src/core/nuxt.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,8 @@ async function initNuxt (nuxt: Nuxt) {
addWebpackPlugin(ImportProtectionPlugin.webpack(config))

// Add unctx transform
addVitePlugin(UnctxTransformPlugin(nuxt).vite())
addWebpackPlugin(UnctxTransformPlugin(nuxt).webpack())
addVitePlugin(UnctxTransformPlugin(nuxt).vite({ sourcemap: nuxt.options.sourcemap }))
addWebpackPlugin(UnctxTransformPlugin(nuxt).webpack({ sourcemap: nuxt.options.sourcemap }))

// Init user modules
await nuxt.callHook('modules:before', { nuxt } as ModuleContainer)
Expand Down
4 changes: 2 additions & 2 deletions packages/nuxt/src/core/plugins/unctx.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export const UnctxTransformPlugin = (nuxt: Nuxt) => {
nuxt.hook('app:resolve', (_app) => { app = _app })
nuxt.hook('pages:middleware:extend', (_middlewares) => { middleware = _middlewares })

return createUnplugin(() => ({
return createUnplugin((options: { sourcemap?: boolean } = {}) => ({
name: 'unctx:transfrom',
enforce: 'post',
transformInclude (id) {
Expand All @@ -23,7 +23,7 @@ export const UnctxTransformPlugin = (nuxt: Nuxt) => {
if (result) {
return {
code: result.code,
map: result.magicString.generateMap({ source: id, includeContent: true })
map: options.sourcemap && result.magicString.generateMap({ source: id, includeContent: true })
}
}
}
Expand Down
3 changes: 2 additions & 1 deletion packages/nuxt/src/pages/macros.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import MagicString from 'magic-string'
export interface TransformMacroPluginOptions {
macros: Record<string, string>
dev?: boolean
sourcemap?: boolean
}

export const TransformMacroPlugin = createUnplugin((options: TransformMacroPluginOptions) => {
Expand All @@ -24,7 +25,7 @@ export const TransformMacroPlugin = createUnplugin((options: TransformMacroPlugi

function result () {
if (s.hasChanged()) {
return { code: s.toString(), map: s.generateMap({ source: id, includeContent: true }) }
return { code: s.toString(), map: options.sourcemap && s.generateMap({ source: id, includeContent: true }) }
}
}

Expand Down
1 change: 1 addition & 0 deletions packages/nuxt/src/pages/module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ export default defineNuxtModule({
// Extract macros from pages
const macroOptions: TransformMacroPluginOptions = {
dev: nuxt.options.dev,
sourcemap: nuxt.options.sourcemap,
macros: {
definePageMeta: 'meta'
}
Expand Down
16 changes: 11 additions & 5 deletions packages/schema/src/config/build.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,12 @@ export default {
return map[val] || (get('vite') === false ? map.webpack : map.vite)
},
},
/**
* Whether to generate sourcemaps.
*
* @version 3
*/
sourcemap: true,
/**
* Shared build configuration.
* @version 2
Expand Down Expand Up @@ -132,7 +138,7 @@ export default {
* @version 2
*/
cssSourceMap: {
$resolve: (val, get) => val ?? get('dev')
$resolve: (val, get) => val ?? get('sourcemap') ?? get('dev')
},

/**
Expand Down Expand Up @@ -242,8 +248,8 @@ export default {
]
for (const name of styleLoaders) {
const loader = val[name]
if (loader && loader.sourceMap === undefined) {
loader.sourceMap = Boolean(get('build.cssSourceMap'))
if (loader && loader.sourcemap === undefined) {
loader.sourcemap = Boolean(get('build.cssSourceMap'))
}
}
return val
Expand Down Expand Up @@ -315,7 +321,7 @@ export default {
*
* @see [terser-webpack-plugin documentation](https://github.com/webpack-contrib/terser-webpack-plugin)
*
* @note Enabling sourceMap will leave `//# sourceMappingURL` linking comment at
* @note Enabling sourcemap will leave `//# sourcemappingURL` linking comment at
* the end of each output file if webpack `config.devtool` is set to `source-map`.
* @version 2
*/
Expand Down Expand Up @@ -493,7 +499,7 @@ export default {
return postcssOptions
}
},
sourceMap: undefined,
sourcemap: undefined,
implementation: undefined,
order: ''
},
Expand Down
3 changes: 2 additions & 1 deletion packages/vite/src/plugins/dynamic-base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import MagicString from 'magic-string'

interface DynamicBasePluginOptions {
globalPublicPath?: string
sourcemap?: boolean
}

export const RelativeAssetPlugin = function (): Plugin {
Expand Down Expand Up @@ -97,7 +98,7 @@ export const DynamicBasePlugin = createUnplugin(function (options: DynamicBasePl
if (s.hasChanged()) {
return {
code: s.toString(),
map: s.generateMap({ source: id, includeContent: true })
map: options.sourcemap && s.generateMap({ source: id, includeContent: true })
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion packages/vite/src/vite.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ export async function bundle (nuxt: Nuxt) {
},
plugins: [
virtual(nuxt.vfs),
DynamicBasePlugin.vite()
DynamicBasePlugin.vite({ sourcemap: nuxt.options.sourcemap })
],
vue: {
reactivityTransform: nuxt.options.experimental.reactivityTransform
Expand Down
1 change: 1 addition & 0 deletions packages/webpack/src/webpack.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ export async function bundle (nuxt: Nuxt) {
// Configure compilers
const compilers = webpackConfigs.map((config) => {
config.plugins.push(DynamicBasePlugin.webpack({
sourcemap: nuxt.options.sourcemap,
globalPublicPath: '__webpack_public_path__'
}))

Expand Down