Как установить пользовательский значок в Express?

136

Я недавно начал работать в Node.js и в файле app.js есть эта строка:

app.use(express.favicon());

Теперь, как мне настроить свой собственный favicon.ico?

Илья Карнаухов
источник
3
Обязательно правильно очистите кеш браузера, иначе вы не увидите, как он меняется
vsync
Использование app.use(express.favicon())в Express 4 дает: Большинство промежуточного программного обеспечения (например, favicon) больше не связано с Express и должно быть установлено отдельно. Пожалуйста, смотрите github.com/senchalabs/connect#middleware . В качестве альтернативы, вы не можете app.get('/favicon.ico', (req, res) => res.status(200)) указывать
пользователь

Ответы:

239

В Экспресс 4

Установите промежуточное ПО favicon и выполните:

var favicon = require('serve-favicon');

app.use(favicon(__dirname + '/public/images/favicon.ico'));

Или лучше, используя pathмодуль:

app.use(favicon(path.join(__dirname,'public','images','favicon.ico')));

(обратите внимание, что это решение будет работать и в приложениях Express 3)

В Экспресс 3

Согласно API, .faviconпринимает параметр местоположения:

app.use(express.favicon("public/images/favicon.ico")); 

В большинстве случаев вы можете захотеть это (как предложил vsync):

app.use(express.favicon(__dirname + '/public/images/favicon.ico'));

Или, еще лучше, используйте pathмодуль (как предложил Druska):

app.use(express.favicon(path.join(__dirname, 'public','images','favicon.ico'))); 

Почему favicon лучше, чем статичный

Согласно описанию пакета :

  1. Этот модуль кэширует значок в памяти для повышения производительности, пропуская доступ к диску.
  2. Этот модуль предоставляет информацию, ETagоснованную на значке, а не на свойствах файловой системы.
  3. Этот модуль будет служить наиболее совместимым Content-Type.
Бенджамин Грюнбаум
источник
1
Спасибо! Не могли бы вы открыть вопрос, чтобы я мог посмотреть там? Надеемся, что только путь, а именно, что path.join(__dirname, "public")приводит к конкатенации строк без разделителя? Чем меньше образец, тем быстрее мы сможем это исправить (так что, если вы можете, пожалуйста, просто часть соединения).
Бенджамин Грюнбаум
Какая польза от использования еще одного промежуточного программного обеспечения (поддерживаемого кем-то, кто на самом деле может не поддерживать его в будущем), вместо того, чтобы более эмпирически объяснять это Эдуардо ?
LucaM
3
@ LucaM прежде всего - хороший вопрос! serve-favicon поддерживается нами (фонд Node.js) и Дугом (который поддерживает экспресс), то есть, теми же людьми, которые пишут и поддерживают экспресс, выражают себя. Вы можете увидеть readme, почему, но в основном: ведение журнала, кэширование, обработка ETag и корректность Content-Type. Вы можете увидеть, что он делает здесь . Как вы думаете, есть смысл редактировать это в ответ?
Бенджамин Грюнбаум
1
Спасибо, Бенджамин, за прояснение возможностей, которые предоставляет favicon . Я бы написал это в принятом ответе, хотя и не обязательно.
LucaM
36

Никаких дополнительных промежуточных программ не требуется. Просто используйте:

app.use('/favicon.ico', express.static('images/favicon.ico'));
Эдуардо
источник
1
Да, этого должно быть достаточно, и это правильный ответ, потому что дополнительное промежуточное ПО для этого ощущается как излишнее.
Jlstr
1
@jlstr это похоже на 20 строк кода, что за избыточное убийство вы имеете в виду)) И это на стороне сервера, так что количество небольших зависимостей не имеет значения. И упомянутое промежуточное программное обеспечение обеспечивает : 1) кэширование памяти 2) установить правильный ETag 3) установить правильныйContent-Type
maxkoryukov
18

смайлик favicon для предотвращения ошибки:

 //const fs = require('fs'); 
 //const favicon = fs.readFileSync(__dirname+'/public/favicon.ico'); // read file
 const favicon = new Buffer.from('AAABAAEAEBAQAAAAAAAoAQAAFgAAACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAA/4QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEREQAAAAAAEAAAEAAAAAEAAAABAAAAEAAAAAAQAAAQAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAP//AAD8HwAA++8AAPf3AADv+wAA7/sAAP//AAD//wAA+98AAP//AAD//wAA//8AAP//AAD//wAA', 'base64'); 
 app.get("/favicon.ico", function(req, res) {
  res.statusCode = 200;
  res.setHeader('Content-Length', favicon.length);
  res.setHeader('Content-Type', 'image/x-icon');
  res.setHeader("Cache-Control", "public, max-age=2592000");                // expiers after a month
  res.setHeader("Expires", new Date(Date.now() + 2592000000).toUTCString());
  res.end(favicon);
 });

изменить значок в коде выше

сделать иконку можно здесь: http://www.favicon.cc/ или здесь: http://favicon-generator.org

преобразовать его в base64 возможно здесь: http://base64converter.com/

затем замените значение значка базы 64

общая информация о том, как создать персонализированный значок избранного

иконки создаются с помощью Photoshop или Inkscape, может быть Inkscape, а затем Photoshop для вибрации и коррекции цвета (в меню Image-> Adjustments).

для быстрой иконки перейдите по ссылке http://www.clker.com/ и выберите несколько графических изображений, и загрузите как svg. затем перенесите его в inkscape ( https://inkscape.org/ ) и измените цвета или удалите детали, возможно, добавьте что-нибудь из другого векторного изображения, затем для экспорта выберите детали для экспорта и нажмите «Файл»> «Экспорт», выберите размер, например, 16x16 для favicon или 32x32. для дальнейшего редактирования 128x128 или 256x256. Пакет ico может иметь несколько размеров иконок внутри. он может иметь наряду с 16x16 пикселем favicon высококачественные иконки для ссылки на сайт.

тогда возможно улучшить изображение в фотошопе. как вибрация, эффект скоса, круглая маска, что угодно.

затем загрузите это изображение на один из веб-сайтов, которые генерируют иконки. Есть также программы для окон для редактирования иконок, такие как https://sourceforge.net/projects/variicons/ .

добавить значок сайта. просто поместите favicon.ico как файл в корневую папку домена. например, в файле node.js в общей папке, содержащей статические файлы. это не должно быть что-то особенное, например, код выше простого файла.

Шимон Дудкин
источник
1
Как этот подход лучше всего. Я просто использовал файл для обслуживания вместо base64: fs.createReadStream ("./ public / favicon.ico"). Pipe (res);
DaafVader
2
Почему бы просто не использовать express.favicon, так как вы уже используете express ?? Зачем создавать весь маршрут, если вы также можете использовать статическую папку? Кроме того, эта волшебная нить (ваш смайлик) не делает ваш случай лучше.
SubliemeSiem
1
Вам не нужно никакого кода, чтобы поставить favicon. Просто поместите его как файл в каталог статических файлов.
Шимон Дудкин
16

Нет необходимости в специальном промежуточном программном обеспечении ?! В экспрессе:

 //you probably have something like this already    
app.use("/public", express.static('public')); 

Затем поместите ваш значок в публичный доступ и добавьте следующую строку в заголовок вашего HTML:

<link rel="icon" href="/public/favicon.ico">
DaafVader
источник
1
Это DaafVader. Это сработало. Моя настройка была: app.use (express.static ('public')). Я сохранил свой значок в папке img, которая находится в общей папке. В моем html-файле в разделе head я использовал <link rel = "icon" href = "/ img / favicon.ico">, где favicon.ico - мое имя файла favicon.
Нхон Ха
8
app.use(express.favicon(__dirname + '/public/images/favicon.ico')); 

У меня он работал локально без, __dirname +но не мог заставить его работать на моем развернутом сервере.

ThomasReggi
источник
попробуйтеapp.use(express.favicon('./public/images/favicon.ico'));
Alexis Diel
5

Если вы используете Express> 4.0, вы можете перейти на serve-favicon

Анастасиос Андронидис
источник
8
Почему мы должны идти на фавикон?
Черный
4

Если у вас установлен статический путь, просто используйте его <link rel="icon" href="https://stackoverflow.com/images/favicon.ico" type="image/x-icon">в своих представлениях. Больше ничего не нужно. Пожалуйста, убедитесь, что у вас есть папка с изображениями в общей папке.

Мохсин Хан
источник
1
Просто убедитесь, что вы используете 127.0.0.1вместо localhostGoogle Chrome во время разработки, по какой-то причине, что исправило это для меня.
cprcrack
1

Установите express-faviconпромежуточное ПО:

npm install express-favicon --save

Используйте это так:

const favicon = require('express-favicon');
app.use(favicon(__dirname + 'favicon.ico'));
elig
источник
1

Вы должны установить промежуточное программное обеспечение для обслуживания значка.

Я попробовал это только сейчас:

app.use(express.favicon(path.join(__dirname, 'public','images','favicon.ico'))); 

и получил это сообщение об ошибке обратно:

Ошибка: большая часть промежуточного программного обеспечения (например, favicon) больше не связана с Express и должна быть установлена ​​отдельно. Пожалуйста, смотрите https://github.com/senchalabs/connect#middleware .

Я думаю, что мы можем принять это как окончательное.

amunnelly
источник
0

Код, указанный ниже, работает:

var favicon = require('serve-favicon');

app.use(favicon(__dirname + '/public/images/favicon.ico'));

Просто не забудьте обновить браузер или очистить кеш.

blakeface
источник
0

шаг 0: добавьте приведенный ниже код в app.js или index.js

app.use("/favicon.ico", express.static('public/favicon.ico'));

шаг 1: загрузите значок отсюда https://icons8.com/ или создайте свой собственный
шаг 2: перейдите на https://www.favicongenerator.com/
шаг 3 : загрузить загруженный файл icon.png> установить 16px> создать favicon> скачать
шаг 4: перейдите в папку загрузок, вы найдете [.ico file], переименуйте его в favicon.ico,
шаг 5: скопируйте favicon.ico в публичный каталог Вы создали
шаг 6: добавьте приведенный ниже код в свой файл .pug под заголовком head, под заголовком title

<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">

шаг 7: сохранить> перезапустить сервер> закрыть браузер> снова открыть браузер> появится значок «

Примечание»: вы можете использовать имя, отличное от favicon,
            но не забудьте изменить имя в коде и в общей папке.

Мехран Ахмед
источник
0

В app.js:

app.use(express.static(path.join(__dirname, 'public')));

Предполагая, что значок находится в "/public/images/favicon.ico", добавьте следующую ссылку в заголовок HTML:

<link rel='icon' href='/images/favicon.ico' class='js-favicon'>

Это хорошо работало в проекте, автоматически сгенерированном с помощью команды:

express my-project
Николас Х
источник
0

Если вам нужно решение, которое не включает внешние файлы и не использует express.static(например, сверхлегкий веб-сервер с одним файлом и сайт), вы можете использовать serve-faviconи кодировать свой favicon.icoфайл как Base64. Как это:

const favicon = require('serve-favicon');
const imgBuffer = new Buffer.from('IMAGE_AS_BASE64_STRING_GOES_HERE', 'base64');
// assuming app is already defined
app.use(favicon(imgBuffer));

Замените IMAGE_AS_BASE64_STRING_GOES_HEREрезультатом кодирования вашего файла favicon как Base64. Есть много сайтов, которые могут сделать это онлайн, есть поиск.

Обратите внимание, что вам может потребоваться перезапустить сервер и / или браузер, чтобы увидеть, как он работает localhost, и жестко обновить / очистить кеш браузера, чтобы он работал в Интернете.

JPW
источник