# TIL-20210323
# vuepress의 sidebar 자동화
다른 사람들은 vuepress로 github pages를 어떻게 운영하나 구경을 다녔다.
그 과정에서 누군가 sidebar를 자동화 해서 사용하는걸 봤다.
그 분은 다른 라이브러리에서 dirTree를 만들어 적용하는 방식을 이용했다.
나는 nodejs
에서 fs
를 통해 directory구조를 읽어와서 트리를 만들어 보기로 했다.
# 기존 방식
vuepress
에서 sidebar를 설정하는 방식은 config.js
를 통해서 진행한다.
// docs/.vuepress/config.js
sidebar: [
{
title: 'TIL', // required
path: '/TIL/', // optional, link of the title, which should be an absolute path and must exist
sidebarDepth: 1, // optional, defaults to 1
children: [
// ...
'TIL-20210320',
'TIL-20210321',
'TIL-20210322',
// ...
]
},
],
내가 생각하는 블로그의 파일 구조는
- title은 항상 메인 디렉토리 이름
- path도 그래서 항상 일정함
- children은 그 하위에 작성된
*.md
파일들
# 적용 방식
다음과 같은 순서로 구현해 보기로 했다.
- 먼저 파일 구조를 title을 기반으로 읽어 온다.
- 파일 구조 안에서
README.md
는 제외하고 리스트를 생성한다. - 파일이 아니라면 추가하지 않는다. (src같은걸 나중에 넣을지도 모른다고 생각했다.)
- 구현 코드
// docs/.vuepress/dirTree.js
const fs = require('fs');
const defaultPath = './docs'
const dirTree = (dirname) => {
let path = defaultPath + `/${dirname}`
let list = fs.readdirSync(path)
let result = [];
for (let fileName of list) {
let stat = fs.statSync(path + `/${fileName}`)
if (stat.isFile() && !/^README/.test(fileName)) {
result.push(`/${dirname}/${fileName}`)
}
}
return result
}
module.exports = dirTree
// config.js
{
// ...
children: dirTree('TIL')
}
# 구현하면서 충돌한 문제
fs
모듈의 비동기 처리 result라는 결과는 항상 파일의 구조를 읽고나서,
해당 파일이 내가 필요한 파일인지 아닌지 확인해야지만 가능하다.
때문에 fs
모듈이 비동기로 처리되면서 정확한 결과가 나오지 않는 경우가 있었다.
async / await
을 통해 비동기처리를 변경하려고 fs.promises
를 설정하여 fs
모듈을 promise
로 변환해 사용도 했었다.
그렇게 되니까 dirTree
자체가 비동기 함수가 되면서 config
에서 매번 설정값을 만들어 내는게 어려웠다.
그래서 모든 메소드를 동기적으로 실행하도록 sync
메소드를 사용해서 처리했다.
# 결론
비동기 처리는 생각보다 더 복잡하다.