Dev.to – отличное место для технического блога. Сайт кажется легким и простым в навигации, а сообщество приветствует. Тем не менее, вы можете сначала опубликовать свой контент под собственным доменом, который у вас есть полный контроль. Затем вы можете захотеть пересечь, чтобы разработать по ссылке на канонический URL.
Когда я начал писать изначально, мой рабочий процесс был таким:
- Напишите сообщение в блоге, не выходя из моего текстового редактора на местном уровне
- Публикуйте в моем личном блоге
- Перекрестный пост, чтобы разработать вручную
Последняя часть определенно требовала автоматизации. Есть способ Публикуйте из RSS Но я понял, что некоторые изменения должны быть внесены в контент, прежде чем он может быть опубликован на Dev.
Другой подход – использовать Dev API. Мой блог построен с Месяти лет И я добавил небольшой вспомогательный сценарий NPM, чтобы помочь с перекрестным сообщением. Он загружает сообщение в блоге из файла Markdown, публикует проект в Dev и возвращает URL -адрес проекта. Там вы можете убедиться, что все выглядит хорошо (Иногда мне может потребоваться скорректировать теги) и нажимать Публиковать Анкет
Рабочий процесс теперь выглядит так:
- Напишите сообщение в блоге, не выходя из моего текстового редактора на местном уровне
- Публикуйте в моем личном блоге
- Запустить
npm run→ Следите за проектом ссылки на обзор → Публиковать
Если это звучит полезно, ниже приведено (дружественное для начинающих) руководство по добавлению такого сценария в свой собственный блог.
Создайте ключ Dev API
В вашем профиле разработчика перейдите к Настройки → Учетная запись → Dev Community API -ключи
Дайте клавишу имя (например,
Скопируйте ключ и поместите его в .env файл в корне вашего блога. Убедитесь, что этот файл указан в .gitignore Поскольку мы не хотим, чтобы секреты приземлились в репозитории GIT.
.env
DEV_TO_API_KEY=your-api-key
Сценарий NPM, чтобы опубликовать в Dev
Если не установлено, вам нужно будет добавить эти пакеты в зависимости Dev:
npm i --save-dev dotenv gray-matter node-fetch
Вы можете найти весь скрипт здесь: https://github.com/maximivanov/maxivanov.io/blob/main/scripts/publish-to-devto.js
Для начала мы загружаем .env Файл, включите зависимости и настройте некоторые настройки.
./scripts/publish-to-devto.js
require('dotenv').config() // make the API key available as an environment variable
const matter = require('gray-matter') // library to parse front-matter and content from posts' markdown files
const fetch = require('node-fetch')
const apiKey = process.env.DEV_TO_API_KEY
const apiUrl = 'https://dev.to/api/articles'
const siteUrl = 'https://www.maxivanov.io' // hostname of the blog
const autoPublish = false // whether we want to publish or create drafts
Основной орган сценария, который получает данные, отправляет запрос API и печатает проект URL:
./scripts/publish-to-devto.js
...
;(async () => {
const path = process.argv.slice(2)[0] // read file name from command line arguments
const file = matter.read(path)
const payload = getPayload(file) // get payload to publish to DEV API (see below)
const article = await publish(payload)
if (autoPublish) {
console.log(`Article published: ${article.url}`)
} else {
console.log(`Article draft created: ${article.url}/edit`)
}
})()
Функция для подготовки данных для публикации в API:
./scripts/publish-to-devto.js
...
function getPayload(file) {
return {
article: {
title: file.data.title.trim(),
// replace relative paths with absolute URLs
body_markdown: file.content.trim().replace(/\]\(\/posts\//gm, `](${siteUrl}/posts/`),
published: autoPublish,
// if you want blog post to be a part of Series on DEV
series: undefined,
// cover image URL
main_image: file.data.image ? `${siteUrl}${file.data.image}` : undefined,
// generate the canonical url (file name minus .md in my case)
canonical_url: `${siteUrl}/${file.path.split('/').slice(-2, -1)[0]}`,
description: file.data.description,
// DEV allows only 4 tags and they must be alphanumeric
tags: file.data.tags.slice(0, 4).map(tag => tag.toLowerCase().replace(/[^a-z0-9]/i, '')),
}
}
}
И, наконец, функция публикации подготовленной полезной нагрузки в API:
./scripts/publish-to-devto.js
...
async function publish(payload) {
const response = await fetch(apiUrl, {
method: 'post',
body: JSON.stringify(payload),
headers: {'Content-Type': 'application/json', 'api-key': apiKey}
});
const json = await response.json();
if (json.error) {
throw new Error(`API returned an error: ${json.error}`)
}
return json
}
Добавьте новый сценарий в Package.json :
./package.json
{
...
"scripts": {
...
"publish-to-devto": "node ./scripts/publish-to-devto.js"
}
}
И позвоните в командную строку:
npm run publish-to-devto posts/2021/01/add-docker-container-name-to-shell-prompt.md
…
Хорошо! Мы только что избавились от скучной ручной работы, которая всегда хороша.
Оригинал: “https://dev.to/maxivanov/cross-post-from-your-blog-to-dev-to-node-js-script-59j4”