Parceljs/PostHTML — предотвращение переименования файлов .htm в .html

При построении с помощью файлов участков .htm на выходе получаются файлы .html. Я скорее просто сохраняю файлы .htm в качестве выходных файлов, но не могу найти способ сделать это ни в Parcel, ни в PostHTML, который используется посылкой.

Я обновил старый статический веб-сайт, чтобы использовать Parcel в качестве инструмента сборки. Все файлы веб-сайта имеют расширение .htm.

У меня проблема: в настоящее время посылка автоматически переименовывает все файлы .htm в .html, а также автоматически обновляет все внутренние ссылки на .html.

В настоящее время это проблема, потому что сайт индексируется поисковыми системами с суффиксами файлов .htm, поэтому в настоящее время мне нужно либо хранить две копии, либо выполнять перенаправления для каждого файла .htm.

У других, кажется, такая же проблема: github.com/parcel-bundler/parcel/issues/884, но она так и не была решена...

exside 25.07.2019 18:07

@exside Parcel имеет тенденцию закрывать нерешенные вопросы без обсуждения. Я лично повторно зарегистрировал проблемы, чтобы предельно ясно указать, что основные предложения, поддержанные кучей людей, не могут быть молча проигнорированы.

jhpratt 28.07.2019 01:09

В дополнение к ранее прокомментированной проблеме с github, есть также Вот этот. Похоже, владельцы не хотят, чтобы посылка отказывалась от ответственности за пристройки. Я бы рекомендовал написать короткий скрипт для переименования переименованных файлов.

Das_Geek 30.07.2019 15:30
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
3
472
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не думаю, что это поддерживается «из коробки» в пакете 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, что было достаточно хорошо и проще в нашем случае.

shukshuk 07.11.2021 09:08

Другие вопросы по теме