# 自定义块
在 .vue 文件中,你可以自定义语言块。应用于一个自定义块的 loader 是基于这个块的 lang 特性、块的标签名以及你的 webpack 配置进行匹配的。
如果指定了一个 lang 特性,则这个自定义块将会作为一个带有该 lang 扩展名的文件进行匹配。
你也可以使用 resourceQuery 来为一个没有 lang 的自定义块匹配一条规则。例如为了匹配自定义块 <foo>:
{ module: { rules: [ { resourceQuery: /blockType=foo/, loader: 'loader-to-use' } ] } } 如果找到了一个自定义块的匹配规则,它将会被处理,否则该自定义块会被默默忽略。
此外,如果这个自定义块被所有匹配的 loader 处理之后导出一个函数作为最终结果,则这个 *.vue 文件的组件会作为一个参数被这个函数调用。
# Example
这里有一个向组件内注入 <docs> 自定义块的示例,且它是在运行时可用的。
为了注入自定义块的内容,我们将会撰写一个自定义 loader:
module.exports = function (source, map) { this.callback( null, `export default function (Component) { Component.options.__docs = ${ JSON.stringify(source) } }`, map ) } 现在我们将会配置 webpack 来使用为 <docs> 自定义块撰写的自定义 loader。
// wepback.config.js module.exports = { module: { rules: [ { resourceQuery: /blockType=docs/, loader: require.resolve('./docs-loader.js') } ] } } 现在我们可以在运行时访问被导入组件的 <docs> 块内容了。
<!-- ComponentB.vue --> <template> <div>Hello</div> </template> <docs> This is the documentation for component B. </docs> <!-- ComponentA.vue --> <template> <div> <ComponentB/> <p>{{ docs }}</p> </div> </template> <script> import ComponentB from './ComponentB.vue'; export default { components: { ComponentB }, data () { return { docs: ComponentB.__docs } } } </script>