React에서 가격 인하 편집기를 만듭니다.Github 작업을 통해 배포된 js-TypeScript(&T)
뭐 공부 해요?
프로젝트 소스 코드:
아스바메그 / react typescript 태그 편집기
React 태그 편집기를 사용합니다.js 및 TypeScript는 Github 작업 흐름을 사용한 연속 배포와 결합됩니다.
프로젝트 프레젠테이션: ashwamegh/react typescript 태그 편집기
프로젝트 설정부터 시작하겠습니다.
1. React를 사용하여 프로젝트를 설정합니다.유형 스크립트(&T)
우리는 모두 TypeScript의 기능이 어떻게 당신의 어리석은 실수를 위해 시간을 절약하는지 알고 있습니다.만약react와 결합한다면 그것들은 모든 응용에 동력을 제공하는 강력한 조합이 될 것이다.
기존 TypeScript 지원이 제공되므로
create-react-app
를 사용하겠습니다.항목을 만들 루트 디렉토리로 이동하여 다음 명령을 실행합니다.npx create-react-app markdown-editor --template typescript
이 --template typescript
로고는 모든 힘든 작업을 완성할 수 있도록 React를 설정합니다.TypeScript가 있는 js 프로젝트입니다.나중에 응용 프로그램을 만들기 위해 부트 코드를 삭제해야 합니다.
참고로 이 초기 커밋을 확인하여 삭제된 컨텐트를 볼 수 있습니다.
https://github.com/ashwamegh/react-typescript-markdown-editor/commit/7cc379ec0d01f3f1a07396ff2ac6c170785df57b
초기 단계를 마친 후에 우리는 계속해서 태그 편집기를 만들 것이다.2. 가격 인하 편집기 만들기
코드를 깊이 연구하기 전에 우리가 개발할 프로젝트의 폴더 구조를 봅시다.
├── README.md
├── package.json
├── public
| ├── favicon.ico
| ├── index.html
| ├── logo192.png
| ├── logo512.png
| ├── manifest.json
| └── robots.txt
├── src
| ├── App.test.tsx
| ├── App.tsx
| ├── components
| | ├── Editor.tsx
| | ├── Footer.tsx
| | ├── Header.tsx
| | ├── Main.tsx
| | ├── Preview.tsx
| | └── shared
| | └── index.tsx
| ├── index.css
| ├── index.tsx
| ├── react-app-env.d.ts
| ├── serviceWorker.ts
| ├── setupTests.ts
| └── userDarkMode.js
├── tsconfig.json
└── yarn.lock
나는 emotion
을 사용하여 내 구성 요소에 스타일을 만들고, react-icons
을 사용하여 프로젝트에서 사용하는 아이콘에 스타일을 만들 것이다.따라서 다음 명령을 실행하여 emotion
및 react-icons
을 설치해야 합니다.npm i -S @emotion/core @emotion/styled react-icons
아니면 나처럼 yarn
를 사용하면 달리기를 할 수 있다yarn add @emotion/core @emotion/styled react-icons
다음에 우리는 먼저 shared
구성 요소 폴더를 만들어서 우리가 다시 사용할 구성 요소를 만들 것입니다.
/* src/components/shared/index.tsx */
import React from 'react'
import styled from '@emotion/styled'
export const ColumnFlex = styled.div`
display: flex;
flex-direction: column;
`
export const RowFlex = styled.div`
display: flex;
flex-direction: row;
`
In this file, we have declared two styled components for
flex-column
andflex-row
styleddivs
which we'll be using later.
To know more aboutstyled-components
withemotion
library, head on to this link.
3 React 연결을 사용하여 사용자 정의 테마 연결 만들기
우리는 기본적인 테마 기능을 실현하기 위해react 연결을 사용하여 사용자 정의 연결을 만들 것입니다. 이 기능을 사용하면 테마를 연한 색에서 짙은 색으로 전환할 수 있습니다.
/* useDarMode.js */
import { useEffect, useState } from 'react'
export default () => {
const [theme, setTheme] = useState('light')
const toggleTheme = () => {
if (theme === 'dark') {
setTheme('light')
} else {
setTheme('dark')
}
}
useEffect(() => {
const localTheme = localStorage.getItem('theme')
if (localTheme) {
setTheme(localTheme)
}
}, [])
return {
theme,
toggleTheme,
}
}
In our hooks file, we are setting the initial state of the theme to be
light
usinguseState
hook. And usinguseEffect
to check whether any theme item exists in our browser's local storage, and if there is one, pick the theme from there and set it for our application.
공유 구성 요소와 사용자 정의react 갈고리를 테마로 정의했으니 응용 프로그램 구성 요소를 깊이 있게 연구합시다.
따라서, 나는 우리의 응용 프로그램 구조를 다섯 개의 구성 요소로 나눈다. 각각 머리글, 주 (편집기와 미리 보기 구성 요소가 있는 응용 프로그램의 주요 부분을 포함) 와 머리글 구성 요소이다.
i, 편집기//편집기 코드 포함
2.가격 인하 코드를 HTML로 미리 보는 코드 미리 보기//포함
/* src/components/Header.tsx */
import React from 'react'
import { FiSun } from 'react-icons/fi'
import { FaMoon } from 'react-icons/fa'
// this comment tells babel to convert jsx to calls to a function called jsx instead of React.createElement
/** @jsx jsx */
import { css, jsx } from '@emotion/core'
// Prop check in typescript
interface Props {
toggleTheme: () => void,
theme: string
}
const Header: React.FC<Props> = ({ theme, toggleTheme }) => {
return (
<header
css={theme === 'dark' ?
css`
display: flex;
flex-direction: row;
justify-content: space-between;
background-color: #f89541;
padding: 24px 32px;
font-size: 16px;
`:css`
display: flex;
flex-direction: row;
justify-content: space-between;
background-color: #f8f541;
padding: 24px 32px;
box-shadow: 0px -2px 8px #000;
font-size: 16px;
`}>
<div className="header-title">
Markdown Editor
</div>
<div css={
css`
cursor: pointer;
`}
onClick={toggleTheme}
>
{
theme === 'dark'?
<FaMoon />:
<FiSun />
}
</div>
</header>
)
}
export default Header;
In this component, we are using TypeScript for prop checks and you may wonder, why we're mentioning
React.FC
here. Its just that, by typing our component as an FC (FunctionComponent), the React TypeScripts types allow us to handle children and defaultProps correctly.
css
라이브러리에 문자열 스타일이 있는 emotion
prop을 사용하여 구성 요소의 스타일을 설계할 수 있습니다. 문서here에 따라 더 많은 정보를 알 수 있습니다.머리글 구성 요소를 만든 후에 꼬리 구성 요소를 만들고 메인 구성 요소로 이동합니다.
페이지 구성 요소의 코드를 보여 줍니다
import React from 'react'
// this comment tells babel to convert jsx to calls to a function called jsx instead of React.createElement
/** @jsx jsx */
import { css, jsx } from '@emotion/core'
const Footer: React.FC = () => {
return (
<footer>
<div
className="footer-description"
css={
css`
padding: 16px 0px;
overflow: hidden;
position: absolute;
width: 100%;
text-align: center;
bottom: 0px;
color: #f89541;
background: #000;
`
}>
<span>{`</>`}</span><span> with <a href="https://reactjs.org" target="_blank">React.js</a> & <a href="https://www.typescriptlang.org/" target="_blank">TypeScript</a></span>
</div>
</footer>
)
}
export default Footer;
바닥글 구성 요소는 흔히 볼 수 있는 신용 정보를 보여주는 간단한 코드를 포함한다./* src/components/Main.tsx */
import React, { useState } from 'react'
// this comment tells babel to convert jsx to calls to a function called jsx instead of React.createElement
/** @jsx jsx */
import { css, jsx } from '@emotion/core'
import { RowFlex } from './shared'
import Editor from './Editor';
import Preview from './Preview';
interface Props {
theme: string
}
const Main: React.FC<Props> = ({ theme }) => {
const [markdownContent, setMarkdownContent] = useState<string>(`
# H1
## H2
### H3
#### H4
##### H5
__bold__
**bold**
_italic_
`);
return (
<RowFlex
css={css`
padding: 32px;
padding-top: 0px;
height: calc(100vh - 170px);
`}>
<Editor theme={theme} markdownContent={markdownContent} setMarkdownContent={setMarkdownContent}/>
<Preview theme={theme} markdownContent={markdownContent}/>
</RowFlex>
)
}
export default Main;
앞의 구성 요소에서 알 수 있듯이 일부 코드는 당신에게 매우 익숙하기 때문에, 당신은 이제 스스로 이해할 수 있습니다.이외에도 우리는 useState
갈고리를 사용하여 우리의 가격 인하 내용을 저장하는 상태를 만들었고, 코드에서 setMarkdownContent
라고 불리는 처리 프로그램을 사용했다.We need to pass these down to our
Editor
andPreview
components, so that, they can provide the user the way to edit and preview their markdown content. We have also set an initial state for content with some basic markdown text.
편집기 구성 요소의 코드를 보여 줍니다.
/* src/components/Editor.tsx */
import React, { ChangeEvent } from 'react'
import PropTypes from 'prop-types';
// this comment tells babel to convert jsx to calls to a function called jsx instead of React.createElement
/** @jsx jsx */
import { css, jsx } from '@emotion/core'
import { ColumnFlex } from './shared'
interface Props {
markdownContent: string;
setMarkdownContent: (value: string) => void,
theme: string
}
const Editor: React.FC<Props> = ({ markdownContent, setMarkdownContent, theme }) => {
return (
<ColumnFlex
id="editor"
css={css`
flex: 1;
padding: 16px;
`}>
<h2>
Editor
</h2>
<textarea
onChange={(e: ChangeEvent<HTMLTextAreaElement>) => setMarkdownContent(e.target.value)}
css={theme === 'dark'?
css`
height: 100%;
border-radius: 4px;
border: none;
box-shadow: 0 -2px 10px rgba(0, 0, 0, 1);
background: #000;
color: #fff;
font-size: 100%;
line-height: inherit;
padding: 8px 16px;
resize: none;
overflow: auto;
&:focus {
outline: none;
}
`
: css`
height: 100%;
border-radius: 4px;
border: none;
box-shadow: 2px 2px 10px #999;
font-size: 100%;
line-height: inherit;
padding: 8px 16px;
resize: none;
overflow: auto;
&:focus {
outline: none;
}
`}
rows={9}
value={markdownContent}
/>
</ColumnFlex>
)
}
Editor.propTypes = {
markdownContent: PropTypes.string.isRequired,
setMarkdownContent: PropTypes.func.isRequired,
}
export default Editor;
This is a straight forward component which uses
<textarea/>
to provide the user a way to enter their inputs, which have to be further compiled down to render it as HTML content in the Preview component.
현재, 우리는 코드를 저장하기 위해 거의 모든 구성 요소를 만들었습니다. 미리 보기 구성 요소를 제외하고는.
사용자의 가격 인하 내용을 간단한 HTML로 컴파일하는 데 필요한 것이 있습니다. 모든 컴파일러 코드를 컴파일하고 싶지 않습니다. 선택의 여지가 많기 때문입니다.
이 응용 프로그램에서, 우리는
marked
라이브러리를 사용하여 가격 인하 내용을 HTML로 컴파일할 것이다.따라서 다음 명령을 실행하여 설치해야 합니다.npm i -S marked
아니면 실로yarn add marked
If you want to know more about this library, you can see it here
미리 보기 구성 요소의 코드를 봅시다.
/* src/components/Preview.tsx */
import React from 'react'
import PropTypes from 'prop-types'
import marked from 'marked'
// this comment tells babel to convert jsx to calls to a function called jsx instead of React.createElement
/** @jsx jsx */
import { css, jsx } from '@emotion/core'
import { ColumnFlex } from './shared'
interface Props {
markdownContent: string,
theme: string
}
const Preview: React.FC<Props> = ({ markdownContent, theme }) => {
const mardownFormattedContent = ( marked(markdownContent));
return (
<ColumnFlex
id="preview"
css={css`
flex: 1;
padding: 16px;
`}
>
<h2>Preview</h2>
<div
css={theme === 'dark'
? css`
height: 100%;
border-radius: 4px;
border: none;
box-shadow: 0 -2px 10px rgba(0, 0, 0, 1);
font-size: 100%;
line-height: inherit;
overflow: auto;
background: #000;
padding: 8px 16px;
color: #fff;
`
: css`
height: 100%;
border-radius: 4px;
border: none;
box-shadow: 2px 2px 10px #999;
font-size: 100%;
line-height: inherit;
overflow: auto;
background: #fff;
padding: 8px 16px;
color: #000;
`}
dangerouslySetInnerHTML={{__html: mardownFormattedContent}}
>
</div>
</ColumnFlex>
)
}
Preview.propTypes = {
markdownContent: PropTypes.string.isRequired
}
export default Preview;
In this component, we are compiling the markdown content and storing it in mardownFormattedContent variable. And to show a preview of the content in HTML, we will have to use
dangerouslySetInnerHTML
prop to display the HTML content directly into our DOM, which we are doing by adding thisdangerouslySetInnerHTML={{__html: mardownFormattedContent}}
prop for the div element.
마지막으로, 우리는 가격 인하 편집기 프로그램을 만드는 데 필요한 모든 구성 요소를 준비했다.이 모든 것을
App.tsx
파일에 넣읍시다./* src/App.tsx */
import React from 'react'
import { css, jsx } from '@emotion/core'
// Components
import Header from './components/Header'
import Main from './components/Main'
import Footer from './components/Footer';
import useDarkMode from './userDarkMode';
function App() {
const { theme, toggleTheme } = useDarkMode();
const themeStyles = theme === 'light'? {
backgroundColor: '#eee',
color: '#000'
}: {
backgroundColor: '#171616',
color: '#fff'
}
return (
<div
className="App"
style={themeStyles}
>
<Header theme={theme} toggleTheme={toggleTheme}/>
<Main theme={theme}/>
<Footer />
</div>
);
}
export default App;
응용 프로그램 구성 요소에서 하위 구성 요소를 가져오고 테마 도구를 전달합니다.현재 상술한 모든 절차를 마쳤다면, 실행 중인 가격 인하 편집기 프로그램이 있을 것입니다. 제가 사용하는 스타일에 대해서는 제가 언급한 링크를 사용하여 원본 코드를 볼 수 있습니다.
Now, its time to create Github actions for our project to create continuous deployment workflow on every push to master.
4 Github 작업을 통한 연속 배포 설정
Github 작업 흐름을 사용하여 마스터를 전송할 때마다 웹 응용 프로그램을 구축하고 배치합니다.
Since this is not a enterprise application that holds the branches for production and development, I will setup my workflow for master branch, but if in any time in future, you require to setup the Github action workflow for your enterprise application, Just be careful with the branches.
이를 위해 다음 단계를 따르겠습니다.
.github/workflows/
에 폴더를 만듭니다.JamesIves/github-pages-deploy-action
조작을 사용하여 응용 프로그램을 배치할 것이다..yml
파일을 만들 것이다. 이 파일은 응용 프로그램을 구축하고 GitHub 페이지에 배치하는 것을 책임진다.이름을 지어봅시다 build-and-deploy-to-gh-pages.yml
build-and-deploy-to-gh-pages.yml
.# build-and-deploy-to-gh-pages.yml
name: Build & deploy to GitHub Pages
on:
push:
branches:
- master
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v1
- name: Set up Node
uses: actions/setup-node@v1
with:
node-version: 10.x
- name: Set email
run: git config --global user.email "${{ secrets.adminemail }}"
- name: Set username
run: git config --global user.name "${{ secrets.adminname }}"
- name: npm install command
run: npm install
- name: Run build command
run: npm run build
- name: Deploy
uses: JamesIves/github-pages-deploy-action@releases/v3
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BASE_BRANCH: master
BRANCH: gh-pages # The branch the action should deploy to.
FOLDER: build # The folder the action should deploy.
이 작업 흐름은 매번 실행됩니다. 우리는 일부 물건을 마스터에 전송하고 gh-pages
지점을 통해 응용 프로그램을 배치합니다.워크플로우 파일 분해
name: Build & deploy to GitHub Pages
on:
push:
branches:
- master
이것은 우리의 작업 흐름 이름과 그 중에서 작업을 실행하는 데 사용되는 트리거를 정의합니다.여기에서 우리는 트리거를 설치하여 Push
지점 중의 모든 master
사건을 정탐한다.jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v1
- name: Set up Node
uses: actions/setup-node@v1
with:
node-version: 10.x
- name: Set email
run: git config --global user.email "${{ secrets.adminemail }}"
- name: Set username
run: git config --global user.name "${{ secrets.adminname }}"
- name: npm install command
run: npm install
- name: Run build command
run: npm run build
- name: Deploy
uses: JamesIves/github-pages-deploy-action@releases/v3
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BASE_BRANCH: master
BRANCH: gh-pages # The branch the action should deploy to.
FOLDER: build # The folder the action should deploy.
이것은 우리의 작업 절차에서 가장 중요한 부분으로 완성해야 한다고 성명했다jobs
.설정 중의 일부 줄은 자체 해석된 것runs-on: ubuntu-latest
으로 시스템을 정의하고 그 위에서 실행될 것이다.- name: Checkout
uses: actions/checkout@v1
이것은 Repo를 검사하는 작업입니다. 앞으로의 작업에서 우리는 노드를 설치하고git 프로필을 설정함으로써 개발 환경을 설정할 것입니다.그리고 모든 의존항을 추출하기 위해 npm install
명령을 실행합니다.- name: Deploy
uses: JamesIves/github-pages-deploy-action@releases/v3
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BASE_BRANCH: master
BRANCH: gh-pages # The branch the action should deploy to.
FOLDER: build # The folder the action should deploy.
After the build command has been completed, we are using
JamesIves/github-pages-deploy-action@releases/v3
action to deploy our build folder togh-pages
.
이 워크플로우는 주 지점에서 특정 컨텐트를 푸시할 때마다 실행되며 정적 구축 폴더를
build
지점에 배치합니다.현재, 배치가 완료되면, 당신은github 링크 https://yourusername.github.io/markdown-editor/ 에서 응용 프로그램을 실행할 수 있습니다.
Don't forget to add
"homepage" : "https://yourusername.github.io/markdown-editor/"
inpackage.json
file, otherwise serving of static contents may cause problem.
만약 당신이 나의 글을 좋아한다면 트위터에서 나의 일보
gh-pages
를 팔로우할 수도 있고, Github를 통해 나의 개인 프로젝트를 팔로우할 수도 있다.평론을 발표해 주십시오. 당신은 이 문장이 어떻다고 생각합니까?감사합니다.액체 오류: 내부
아스바메그 / react typescript 태그 편집기
React 태그 편집기를 사용합니다.js 및 TypeScript는 Github 작업 흐름을 사용한 연속 배포와 결합됩니다.
Reference
이 문제에 관하여(React에서 가격 인하 편집기를 만듭니다.Github 작업을 통해 배포된 js-TypeScript(&T)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/ashwamegh/creating-a-markdown-editor-in-react-js-typescript-with-deployment-through-github-actions-hfn텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)