当空加载程序添加到 webpack 的 .use 子句时,Vue 自定义块会产生错误
Vue custom block produce error when an empty loader added to .use clause of webpack
如果vue文件中有自定义块。例如
<router3333>
path: /:category/:segment
</router3333>
它将被编译并在 .use 子句中配置为唯一的 vue 加载器时正常工作
如果我将另一个加载器添加到 use 子句中,例如整个加载器什么都不做
module.exports = function (source) { return source }
编译将因错误而失败
Module parse failed: Unexpected token (24:17)
File was processed with these loaders:
* ./my-loader.js
* ./node_modules/vue-loader/lib/index.js
You may need an additional loader to handle the result of these loaders.
|
|
> path: /:category/:segment
两种情况下 vue-loader 的输出是一样的
import { render, staticRenderFns } from "./xxxc.vue?vue&type=template&id=0067048f&" 01:13:55
import script from "./xxxc.vue?vue&type=script&lang=ts&"
export * from "./xxxc.vue?vue&type=script&lang=ts&"
/* normalize component */
import normalizer from "!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js"
var component = normalizer(
script,
render,
staticRenderFns,
false,
null,
null,
null
)
/* custom blocks */
import block0 from "./xxxc.vue?vue&type=custom&index=0&blockType=router3333"
if (typeof block0 === 'function') block0(component)
export default component.exports
因此,只需添加一个在 use
子句中不执行任何操作的加载器,自定义块就会失败。这里发生了什么以及如何避免它?
这里是重现https://codesandbox.io/s/codesandbox-nuxt-4dqmy
如果在 nuxt.config 中设置 vuetify.treeShake: true - 它将执行此处描述的操作,例如添加另一个加载程序以使用子句,这将导致错误。加载程序代码本身并不重要,因为它也会发生在空加载程序中。
Whats happening here ...?
答案很简单——因为你有另一个用于 vue
文件的加载器(这就是为什么即使 vuetify-loader
也会使你的构建失败),并且可以用 vue-loader
source code function which is responsible for this. It just checks number of loaders and decides to add import
statement for a custom block or just pass empty string [code block] 来证明。
... and how to avoid it ?
Vue-loader 有自定义块功能的文档部分。
您可以使用 blockType
查询参数创建一个 新规则 来处理您的自定义
router3333
区块代码:
rules: [
// ...
{
resourceQuery: /blockType=router3333/,
loader: require.resolve('./my-loader')
}
// ...
]
如您所见,您应该在上面的代码中使用块标记作为类型。
如果您现在不想对您的自定义块内容做任何事情,只需 return 来自加载程序函数的 空字符串 。
如果vue文件中有自定义块。例如
<router3333>
path: /:category/:segment
</router3333>
它将被编译并在 .use 子句中配置为唯一的 vue 加载器时正常工作
如果我将另一个加载器添加到 use 子句中,例如整个加载器什么都不做
module.exports = function (source) { return source }
编译将因错误而失败
Module parse failed: Unexpected token (24:17)
File was processed with these loaders:
* ./my-loader.js
* ./node_modules/vue-loader/lib/index.js
You may need an additional loader to handle the result of these loaders.
|
|
> path: /:category/:segment
两种情况下 vue-loader 的输出是一样的
import { render, staticRenderFns } from "./xxxc.vue?vue&type=template&id=0067048f&" 01:13:55
import script from "./xxxc.vue?vue&type=script&lang=ts&"
export * from "./xxxc.vue?vue&type=script&lang=ts&"
/* normalize component */
import normalizer from "!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js"
var component = normalizer(
script,
render,
staticRenderFns,
false,
null,
null,
null
)
/* custom blocks */
import block0 from "./xxxc.vue?vue&type=custom&index=0&blockType=router3333"
if (typeof block0 === 'function') block0(component)
export default component.exports
因此,只需添加一个在 use
子句中不执行任何操作的加载器,自定义块就会失败。这里发生了什么以及如何避免它?
这里是重现https://codesandbox.io/s/codesandbox-nuxt-4dqmy 如果在 nuxt.config 中设置 vuetify.treeShake: true - 它将执行此处描述的操作,例如添加另一个加载程序以使用子句,这将导致错误。加载程序代码本身并不重要,因为它也会发生在空加载程序中。
Whats happening here ...?
答案很简单——因为你有另一个用于 vue
文件的加载器(这就是为什么即使 vuetify-loader
也会使你的构建失败),并且可以用 vue-loader
source code function which is responsible for this. It just checks number of loaders and decides to add import
statement for a custom block or just pass empty string [code block] 来证明。
... and how to avoid it ?
Vue-loader 有自定义块功能的文档部分。
您可以使用 blockType
查询参数创建一个 新规则 来处理您的自定义
router3333
区块代码:
rules: [
// ...
{
resourceQuery: /blockType=router3333/,
loader: require.resolve('./my-loader')
}
// ...
]
如您所见,您应该在上面的代码中使用块标记作为类型。
如果您现在不想对您的自定义块内容做任何事情,只需 return 来自加载程序函数的 空字符串 。