개인 자료 정리 홈페이지 입니다.

Note > 자바스크립트 프레임워크/라이브러리모음

Note > 자바스크립트 프레임워크/라이브러리모음Redux

By a3040, Published on Invalid Date

Redux - A predictable state container for JavaScript apps. | Redux


Redux 시작하기 | Redux


react에서 redux 사용하는 기본 구조입니다.

forgithub00/redux_1 at master · a3040/forgithub00


Redux는 JavaScript 애플리케이션에서 상태 관리를 위한 도구입니다. 

React와 함께 많이 사용되며, React에서 컴포넌트 간에 상태를 공유하고 업데이트하기 위한 상태 관리 방법으로 Redux를 많이 사용합니다.


중요한 메소드는 다음과 같습니다.


createStore(reducer, [preloadedState], [enhancer]): 

애플리케이션의 상태를 저장하고 업데이트하는 스토어를 생성합니다. reducer는 액션에 따라 상태를 업데이트하는 함수이며, preloadedState는 초기 상태값을 나타내며 선택적으로 전달될 수 있습니다. enhancer는 미들웨어와 같은 스토어의 기능을 확장하는 함수입니다.


combineReducers(reducers): 

다수의 리듀서를 하나로 합쳐줍니다. 이를 통해 하나의 애플리케이션 상태를 여러 개의 작은 리듀서로 나눌 수 있습니다.


dispatch(action): 

액션을 발생시킵니다. 액션은 객체 형태로 {type: 'ACTION_TYPE', payload: ...}와 같은 형태로 구성됩니다. 리듀서는 이 액션에 따라 상태를 업데이트합니다.


getState(): 

스토어에 저장된 현재 상태를 반환합니다.


subscribe(listener): 

스토어에 상태가 변경될 때마다 호출되는 콜백 함수를 등록합니다. 이를 통해 상태가 변경될 때마다 UI를 업데이트하거나, 상태 변경을 로그로 기록할 수 있습니다.


applyMiddleware(...middlewares): 

미들웨어를 등록합니다. 미들웨어는 액션을 디스패치하기 전 또는 후에 추가적인 동작을 수행할 수 있습니다. 

Redux Thunk와 같은 미들웨어를 사용하면 비동기 작업을 처리할 수 있습니다.



사용 방법

기본 뼈대를 생성하고 1.~4를 순서대로 진행하면서 필요한 action을추가 하고 사용합니다.


1. actions를 생성합니다

2. reducer를 생성합니다.

3. store를 생성합니다.

4. 사용합니다.


1. actions를 생성합니다

export const increment = () => {
    return {
      type: 'INCREMENT'
    };
  };
  ...


2. reducer를 생성합니다.

const initialState = {
    count: 0
};


export const counterReducer = (state = initialState, action) => {
 switch (action.type) {
  case 'INCREMENT':
    return {
     count: state.count + 1
    };
...
  default:
    return state;
 }
};


3. store를 생성합니다.

import { createStore } from 'redux';
import { Provider } from 'react-redux';
import { counterReducer } from './reducers';
const store = createStore(counterReducer);


const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
  <Provider store={store}>
    <App />
  </Provider>
  </React.StrictMode>
);


4. 사용합니다.

import { useDispatch, useSelector } from 'react-redux';
import { increment, decrement,multiply  } from './actions';


function App() {
 const [value, setValue] = useState(1);
 const dispatch = useDispatch();
 const count = useSelector(state => state.count);


 const handleIncrement = () => {
   dispatch(increment(value));
 };
 ...  
 return (
 <div>
   <h1>Count: {count}</h1>
   <input type="number" value={value} onChange={handleChange} />
   <button onClick={handleIncrement}>Increment</button>
   <button onClick={handleDecrement}>Decrement</button>   
   <div>
       <label>
         Multiply by:
       </label>
       <button onClick={handleMultiply}>Multiply</button>
     </div>
 </div>
  );
}


export default App;
Note > 자바스크립트 프레임워크/라이브러리모음Express

By a3040, Published on Invalid Date

Express - Node.js 웹 애플리케이션 프레임워크 (expressjs.com)



Node.js를 기반으로한 웹 프레임워크로, 서버 측 웹 개발을 위한 도구입니다.




app.use('/admin', function (req, res, next) { // GET 'http://www.example.com/admin/new?sort=desc'
  console.dir(req.originalUrl) // '/admin/new?sort=desc'
  console.dir(req.baseUrl) // '/admin'
  console.dir(req.path) // '/new'
  next()
})


Note > 자바스크립트 프레임워크/라이브러리모음Vite.js

By a3040, Published on Invalid Date

react-router/examples/ssr-data-router at dev · remix-run/react-router (github.com)

시작하기 | Vite (vitejs-kr.github.io)


Vite.js는 개발 서버와 빌드 도구를 제공합니다. 개발 서버는 HMR(Hot Module Replacement)을 지원하여 빠른 개발 환경을 제공하며, 빌드 도구는 Rollup을 기반으로 하여 최적화된 번들링을 제공합니다.


Vite.js는 기존의 Webpack과 비교하여 더 빠른 빌드 시간과 개발 서버의 더 빠른 시작 속도를 제공합니다.


Vite.js는 개발 서버와 빌드 도구를 제공하는 프론트엔드 개발 도구입니다.

Express.js는 서버 사이드 웹 프레임워크입니다.


Express.js와 Vite.js를 사용하려면, Vite.js의 빌드 결과물을 Express.js 애플리케이션에서 정적 파일로 서비스하는 방식으로 사용할 수 있습니다. 이를 통해 Vite.js에서 빌드된 클라이언트 사이드 애플리케이션과 Express.js에서 작성된 서버 사이드 애플리케이션을 함께 사용할 수 있습니다.


Vite.js 빌드 후 정적 파일로 제공합니다.


vite 템플릿 으로 생성하기 : npm create vite@latest vite_react_ts1 -- --template react-ts

템플릿 유형확인 시작하기 | Vite (vitejs-kr.github.io)


npm run build


const express = require('express');
const path = require('path');


const app = express();
const port = process.env.PORT || 3000;

// 정적 파일 경로 설정
app.use(express.static(path.join(__dirname, 'dist')));


// 모든 요청에 대해 index.html을 반환하도록 설정
app.get('*', (req, res) => {
  res.sendFile(path.join(__dirname, 'dist', 'index.html'));
});


app.listen(port, () => {
  console.log(`Server is running at http://localhost:${port}`);
});



- React 프로젝트에서 Webpack 빌드 도구를 대신하여 Vite.js를 사용할 수 있습니다. 

 

- React 프로젝트를 생성합니다.

 npx create-react-app my-app

 cd my-app


- Vite.js를 설치합니다.

 npm install vite --save-dev

 

- Vite.js 설정

 vite.config.js

 module.exports = {
  // 빌드 모드 설정
  mode: 'development',
  // 개발 서버 설정
  server: {
    port: 3000,
  },
};

- 빌드 및 실행

npm run build

npm run dev



동적 Import

const module = await import(`./dir/${file}.js`)


변수 file은 깊이가 1인 파일에 대해서만 나타낼 수 있습니다. 가령 file이 foo/bar인 경우에는 Import가 실패하게 됩니다


특정 고정 위치에서 서비스 하고 싶을때 기본 위치 설정

package.json에 특정 위치 설정

    "build": "vite  build --base /memorize/"


정적파일로 서비스 제공 express/server.js

  // 정적 파일을 제공할 경로를 설정
  app.use('/memorize', express.static(path.join(__dirname, 'memorize')));참고


package.json에 "type": "module"이 명시되어 있지 않으면 Vite는 Node.js 호환성을 위해 다른 파일 확장자를 생성합니다. 즉, .js는 .mjs가 되고, .cjs는 .js가 됩니다.


환경 변수


라이브러리 모드에서 모든 import.meta.env.*는 프로덕션용으로 빌드 시 정적으로 대체됩니다. 그러나 process.env.*는 그렇지 않기에 라이브러리를 사용하는 측에서 이를 동적으로 변경할 수 있습니다. 만약 이 역시 정적으로 대체되길 원한다면 define: { 'process.env.NODE_ENV': '"production"' } 와 같이 설정해주세요.

Note > 자바스크립트 프레임워크/라이브러리모음morgan Node.js 애플리케이션에서 로깅(logging)을 위한 미들웨어 패키지

By a3040, Published on Invalid Date

Node.js 애플리케이션에서 로깅(logging)을 위한 미들웨어 패키지


]# npm install morgan

import morgan from 'morgan'

  let app = express();


  const accessLogStream = fs.createWriteStream(path.join(__dirname, 'log/access.log'), { flags: 'a' });
  app.use(morgan('combined', { stream: accessLogStream }));//아파치 스타일 간단 로깅


expressjs/morgan: HTTP request logger middleware for node.js (github.com)