Пользовательские блоки

Вы можете определять пользовательские блоки внутри файлов *.vue. Загрузчики, применяемые к такому блоку, будут определяться сопоставлением по атрибуту lang блока, имени тега блока, и правил в вашей конфигурации webpack.

Если указан атрибут lang, пользовательский блок будет обработан как файл с расширением, указанном в lang.

Вы также можете использовать resourceQuery для определения правила для блока без атрибута lang. Например, для сопоставления пользовательского блока <foo>:

{
  module: {
    rules: [
      {
        resourceQuery: /blockType=foo/,
        loader: "loader-to-use"
      }
    ];
  }
}

Если для пользовательского блока будет найдено правило — он будет им обработан; в противном случае пользовательский блок будет тихо проигнорирован.

Кроме того, если пользовательский блок экспортирует функцию в качестве конечного результата после обработки всеми соответствующими загрузчиками, то эта функция будет вызываться с компонентом файла *.vue в качестве параметра.

Пример

Небольшой пример внедрения пользовательского блока <docs> в компонент таким образом, что он будет доступен во время выполнения.

Для внедрения содержимого пользовательского блока мы напишем собственный загрузчик:

module.exports = function(source, map) {
  this.callback(
    null,
    `export default function (Component) {
      Component.options.__docs = ${JSON.stringify(source)}
    }`,
    map
  );
};

Настроим webpack использовать наш загрузчик для пользовательских блоков <docs>.

// 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>