При построении с помощью файлов участков .htm на выходе получаются файлы .html. Я скорее просто сохраняю файлы .htm в качестве выходных файлов, но не могу найти способ сделать это ни в Parcel, ни в PostHTML, который используется посылкой.
Я обновил старый статический веб-сайт, чтобы использовать Parcel в качестве инструмента сборки. Все файлы веб-сайта имеют расширение .htm.
У меня проблема: в настоящее время посылка автоматически переименовывает все файлы .htm в .html, а также автоматически обновляет все внутренние ссылки на .html.
В настоящее время это проблема, потому что сайт индексируется поисковыми системами с суффиксами файлов .htm, поэтому в настоящее время мне нужно либо хранить две копии, либо выполнять перенаправления для каждого файла .htm.
@exside Parcel имеет тенденцию закрывать нерешенные вопросы без обсуждения. Я лично повторно зарегистрировал проблемы, чтобы предельно ясно указать, что основные предложения, поддержанные кучей людей, не могут быть молча проигнорированы.
В дополнение к ранее прокомментированной проблеме с github, есть также Вот этот. Похоже, владельцы не хотят, чтобы посылка отказывалась от ответственности за пристройки. Я бы рекомендовал написать короткий скрипт для переименования переименованных файлов.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я не думаю, что это поддерживается «из коробки» в пакете v2, но это можно было бы сделать относительно легко с помощью пользовательского плагин имени.
Вот код, который будет работать:
import { Namer } from "@parcel/plugin";
import path from "path";
export default new Namer({
name({ bundle }) {
if (bundle.type === "html") {
const filePath = bundle.getMainEntry()?.filePath;
if (filePath) {
let baseNameWithoutExtension = path.basename(filePath, path.extname(filePath));
// See: https://parceljs.org/plugin-system/namer/#content-hashing
if (!bundle.needsStableName) {
baseNameWithoutExtension += "." + bundle.hashReference;
}
return `${baseNameWithoutExtension}.htm`;
}
}
// Returning null means parcel will keep the name of non-html bundles the same.
return null;
},
});
Самый простой способ подключить этот плагин к посылке без публикации отдельного пакета — использовать протокол связи пряжи.
Вы бы структурировали свой проект следующим образом:
project
├── .parcelrc
├── package.json
├── src
│ └── index.html
└── parcel-namer-htm
├── package.json
└── src
└── HtmNamer.js <-- the code above
Ваш основной package.json будет ссылаться на вашу папку parcel-namer-htm следующим образом:
{
"name": "my-project",
"dependencies": {
"parcel": "^2.0.0",
"parcel-namer-htm": "link:./parcel-transformer-foo"
}
}
Ваш файл .parcelrc будет выглядеть так:
{
"extends": "@parcel/config-default",
"namers": ["parcel-namer-htm", "..."]
}
И parcel-namer-htm/package.json будет выглядеть так:
{
"name": "parcel-namer-htm",
"main": "src/HtmNamer.js",
"engines": {
"node": ">= 12.0.0",
"parcel": "^2.0.0"
},
}
Спасибо, похоже, это поможет! Первоначальный вопрос был фактически опубликован, когда версия пакета была около 1.4. ~ В конце концов мы использовали bash-скрипт после сборки, чтобы переименовать все файлы и ссылки в каталоге dist, что было достаточно хорошо и проще в нашем случае.
У других, кажется, такая же проблема: github.com/parcel-bundler/parcel/issues/884, но она так и не была решена...