Дело не в том, что у них нет меня, и дело не в том, что я ничего не беру. - Чжуанцзы
Введение
webpack
webpack
Одинаковая конфигурация системы подключаемых в вышеупомянутых! Plug Preions, чтобы решитьloader
другие вещи, которые не могут быть достигнуты.
Если вы хотите написать хороший плагин, вам нужно знатьWebpack
Два из наиболее центральных понятий вcompiler
,compilation
,tapable
. существуетпроцесс компиляции вебпакаВсе должны быть записаны.Webpack
пройти черезPlugin
机制让其更加灵活,以适应各种应用场景。 существуетWebpack
Многие события транслируются в течение жизненного цикла бега,Plugin
Вы можете слушать эти события и проходить их в нужное времяWebpack
который предоставилAPI
Изменения в выводе.
- Функция или класс JavaScript
- Определить инъекцию в прототипе функции (prototype)
compiler
объектapply
метод. -
apply
через функциюcompiler
Вставьте указанный хук события и получите его в обратном вызове хукаcompilation
объект - использовать
compilation
модификация манипуляцииwebapack
Данные внутреннего экземпляра. - Асинхронный плагин, используемый после обработки данных
callback
Перезвоните
Наконец, простойclean-webpack-plugin
.
простой плагин
class WebpackCleanupPlugin {
// 构造函数
constructor(options) {
console.log("WebpackCleanupPlugin", options);
}
// 应用函数
apply(compiler) {
console.log(compiler);
// 绑定钩子事件
compiler.plugin("done", compilation => {
console.log(compilation);
});
}
}
Как использовать Введите и используйте в webpack.config.js следующим образом:
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
// 引入自己的插件
const WebpackCleanupPlugin = require("./WebpackCleanupPlugin");
module.exports = {
devtool: "source-map",
mode: "production",
entry: {
index: "./src/index.js",
chunk1: "./src/chunk1.js"
},
output: {
filename: "[name].[chunkhash].js"
},
module: {
rules: [
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, "css-loader"]
}
]
},
plugins: [
// 提取css插件
new MiniCssExtractPlugin({
// Options similar to the same options in webpackOptions.output
// both options are optional
filename: "[name].[contenthash].css"
}),
// 使用自己的插件
new WebpackCleanupPlugin()
]
};
Плагин, написанный мной, выполняется следующим образом:
-
webpack
После запуска он будет выполняться первым в процессе чтения конфигурацииnew WebpackCleanupPlugin()
Инициализируйте WebpackCleanupPlugin, чтобы получить его экземпляр. - в инициализации
compiler
объект, затем позвонитеWebpackCleanupPlugin.apply(compiler)
Примеры плагинов к входящимcompiler
объект. -
compiler
compiler.plugin
Webpack
трансляции событий. - и может пройти
compiler
объект для работыwebpack
.
компилятор, компиляция
-
Объект Compiler содержит всю информацию о конфигурации среды Webpack.,Включать
options
,hook
,loaders
,plugins
Эта информация, этот объект находится вWebpack
создается при запуске, этоглобально уникальный, что можно просто понимать какWebpack
Примеры;Compiler
Включены следующие:
-
Объект Compilation содержит текущие ресурсы модуля, скомпилированные ресурсы, измененные файлы и т. д.. когда
Webpack
Чтобы разрабатывать режим работы, когда обнаружено изменение файла, новыйCompilation
Он будет создан.Compilation
Объект также предоставляет многие события обратных вызовов для плагинов. пройти черезCompilation
Может читатьCompiler
объект.
Compilation
Включены следующие:
Разница между Компилятором и Компиляцией в том, что:
Compiler
представляет весьWebpack
Compilation
Просто представляет новую компиляцию.
Хуки компилятораа такжекрючок компиляции
Простой плагин для очистки файлов
Каждый раз, когда пакет упаковывается, если файл модифицируется, будет создан новый файл.hashОн также изменится, то этот измененный файл, его предыдущий файл недействителен, чтобы очистить предыдущий файл, мы используем больше isclean-webpack-plugin
, здесь реализовать простую очистку файлов. если ты не знаешьхеш, контентхэш, чанкхэшРазницу можно увидеть в этой статье.
Он примерно разделен на следующие шаги:
- Получать
output
Путь, то есть путь выхода, как правило,dist
- Событие привязки хука
compiler.plugin('done', (stats) => {})
Код реализован следующим образом
const recursiveReadSync = require("recursive-readdir-sync");
const minimatch = require("minimatch");
const path = require("path");
const fs = require("fs");
const union = require("lodash.union");
// 匹配文件
function getFiles(fromPath, exclude = []) {
const files = recursiveReadSync(fromPath).filter(file =>
exclude.every(
excluded =>
!minimatch(path.relative(fromPath, file), path.join(excluded), {
dot: true
})
)
);
// console.log(files);
return files;
}
class WebpackCleanupPlugin {
constructor(options = {}) {
// 配置文件
this.options = options;
}
apply(compiler) {
// 获取output路径
const outputPath = compiler.options.output.path;
// 绑定钩子事件
compiler.plugin("done", stats => {
if (
compiler.outputFileSystem.constructor.name !== "NodeOutputFileSystem"
) {
return;
}
// 获取编译完成 文件名
const assets = stats.toJson().assets.map(asset => asset.name);
console.log(assets);
// 多数组合并并且去重
const exclude = union(this.options.exclude, assets);
console.log(exclude);
// console.log('outputPath', outputPath);
// 获取未匹配文件
const files = getFiles(outputPath, exclude);
// const files = [];
console.log("files", files);
if (this.options.preview) {
// console.log('%s file(s) would be deleted:', files.length);
// 输出文件
files.forEach(file => console.log(" %s", file));
// console.log();
} else {
// 删除未匹配文件
files.forEach(fs.unlinkSync);
}
if (!this.options.quiet) {
// console.log('\nWebpackCleanupPlugin: %s file(s) deleted.', files.length);
}
});
}
}
module.exports = WebpackCleanupPlugin;
Приведенный выше плагин реализует эффект очистки скомпилированных файлов. Я не буду проводить эксперимент здесь, если вам интересно, вы можете скопировать код на локальный и запустить его, чтобы увидеть результаты.
Суммировать
Я примерно знаю, как написать простой чистый файл выше.webpack
изплагин, на самом деле вы можете делать больше вещей следующим образом:
- Чтение выходного ресурса, блоков кода, модулей и зависимостей (в
emit
мероприятие) - Отслеживание изменений файлов
watch-run
- Изменить выходной ресурс
compilation.assets
Конкретная реализация может взглянуть навебпак простым языком
Ссылаться на
Сухой товар! Создайте плагин веб-пакета (включая подробное объяснение + процесс веб-пакета)