storybook for html이 너무 사용하기 어렵기 때문에 pug를 사용하여 잘 사용하는 방법을 생각해 보았습니다.
그런 가운데 storybook을 이용하고 싶은 경우 【코드 보완이 없는 환경에서 HTML을 쓴다】인가 【빌드하고 코피페】, 게다가 쓴 곳에서 pug로서 재이용할 수 있는 내용이 아닙니다.
잘못하면 일이 늘어나는 것만으로 분명히 말해서 사용할 수 없습니다. 검색에도 거의 걸리지 않는 상태입니다.
그렇다고 storybook을 사용하기 위해 nuxt를 이용한다는 것도 다르다고 생각하기 때문에, 잘 사용하는 방법을 생각해 보았습니다.
20/02/26
환경을 만들어 보았습니다. git도 두고 있으므로 이쪽을 참고로 해 주세요.
정적 WEB 사이트용으로도 사용할 수 있는 storybook의 pug 환경을 만들어 보았다
이전 준비
이번 설명하는 내용은 pug의 이용 방법을 설명할 뿐이므로, 특별한 환경은 만들지 않습니다.
샘플을 만드는 것이 번거롭기 때문에 초기 설치 + bootstrap css를 사용하여 진행합니다.
npx -p @storybook/cli sb init --type html
설치하면 우선 이런 느낌의 구성으로 준비합니다.
├── .storybook
│ ├── config.js
│ └── preview-head.html
└── stories
└── sample
├── button.pug
└── sample.stories.js
storybook/preview-head.html
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
stories/sample/button.pug
button.btn.btn-primary(type="button") Primary
button.btn.btn-secondary(type="button") Secondary
button.btn.btn-success(type="button") Success
button.btn.btn-danger(type="button") Danger
button.btn.btn-warning(type="button") Warning
button.btn.btn-info(type="button") Info
button.btn.btn-light(type="button") Light
button.btn.btn-dark(type="button") Dark
stories.js에서 pug에서 직접 표시하는 방법
pug를 로드할 수 있도록 하려면 다음을 추가로 설치하십시오.
npm i pug pug-plain-loader html-loader -D
pug를 읽고 표시하는 것만이라면 실은 간단하기도 합니다.
pug-plain-loader와 html-loader를 통해서만 출력한다.
import { storiesOf } from '@storybook/html';
import Pug2HtmlBtn from '!html-loader!pug-plain-loader!./button.pug'
storiesOf('sample', module)
.add('pug2html', () => Pug2HtmlBtn ) //htmlタグに変換されたものを表示するだけ
Pug의 소스 표시 & 복사를 할 수 있도록 한다
pug로부터 html을 표시할 수 있었다고 해도, 페이지상에서 pug의 소스 표시나 카피를 할 수 없으면 미묘하기 때문에 카피 할 수 있도록 합니다.
코드의 복사에 관해서는 storybook의 addons에 있는 【 Copy code block 】를 사용합니다.
npm i -D @pickra/copy-code-block
pug 소스의 표시 방법은, html-loader만으로 읽어들여 pug의 소스로서 읽어들일 수가 있습니다.
stories/sample/sample.stories.js
import { storiesOf } from '@storybook/html';
import copyCodeBlock from '@pickra/copy-code-block';
import Pug2HtmlBtn from '!html-loader!pug-plain-loader!./button.pug'
import PugSrcBtn from '!html-loader!./button.pug'
storiesOf('sample', module)
.add('pug2html', () => Pug2HtmlBtn ) //htmlタグに変換されたものを表示するだけ
.add('pug&html', () => Pug2HtmlBtn + copyCodeBlock(PugSrcBtn) )
샘플은 올리지 않지만 아래 이미지와 같이 pug 레이아웃이나 mixin 등도 반영할 수 있습니다.
더 쉽게 사용할 수 있는 방법을 생각
nuxt 개발자 레벨이라면, 이 정도의 일이 되어 있으면 충분히 활용할 수 있다고 생각합니다만, 마크업의 사람이 메인으로 사용하는 것을 생각하면 아직 조금 복잡한 느낌입니다.
그리고 import의 기술이 많아져 버리는 점도 문제로서 있습니다.
그 주변을 개선하겠습니다.
가져오기 동적화
require.context라든지 단번에 읽어도 괜찮습니다만, HTML과 pug는 기본 세트로 사용하므로 copyCodeBlock를 래퍼화해 그 안에서 읽어들이도록 합니다.
.storybook/config.js
import { configure } from '@storybook/html';
import copyCodeBlock from '@pickra/copy-code-block';
// 指定したパスのhtml表示とpugソースのコピーボタンを表示する
global.code = (path,title=false) => {
const pug = require(`!html-loader!../stories/${path}.pug`);
const html = require(`!html-loader!pug-plain-loader!../stories/${path}.pug`);
return `
<div class="container mt-4">
${title ? '<h1 class="mb-5">'+title+'</h1>':''}
${html}
<div class="mt-5">
${copyCodeBlock(pug)}
</div>
</div>`
}
// automatically import all files ending in *.stories.js
configure(require.context('../stories', true, /\.stories\.js$/), module);
sample.stories.js에 기술한 내용을 config.js에 기술하고 global 함수로 등록하여 모든 stories.js에서 사용할 수 있습니다.
storiesOf('ボタン', module)
.add('ノーマルボタン', () => code('sample/button','ノーマルボタン') )
이런 느낌의 심플한 기술을 추가하는 것만으로 【제목+HTML+pug】의 표시를 할 수 있게 됩니다.
더 편하게 하다
const path = require('path')
const req = require.context('../stories', true, /\.stories\.pug$/)
req.keys().forEach((pathstr) => {
const dir = path.dirname(pathstr).replace('./','')
const fpath = `${dir}/${path.basename(pathstr,'.pug')}`
const fname = path.basename(pathstr,'.stories.pug')
storiesOf( dir , module)
.add( fname , () => code( fpath , fname) )
})
마크다운도 비슷한 생각으로 만들 수 있습니다.
지금까지의 내용에 마크다운에서의 기술을 추가하면 편집하기 쉬운 페이지를 할 수 있다고 생각합니다.
마크다운도 이번 pug와 같은 생각으로 html-loader와 markdown-loader로 읽는 것만으로 같은 처리를 할 수 있습니다.
const md2html = !html-loader!markdown-loader!パス名
메소드를 똑같이 작성하면 보다 기술을 적게 해, 자유도가 높은 페이지 작성을 할 수 있다고 생각합니다.
참고로 여러 가지 시도하십시오.
Reference
이 문제에 관하여(storybook for html이 너무 사용하기 어렵기 때문에 pug를 사용하여 잘 사용하는 방법을 생각해 보았습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/BigFly3/items/1e9bf8c0a3f786556bb7텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)