- Nodejs
- Cluster
- PM2
- Thread
- NVM 설치 in Window 10
- NVM 설치 in CentOS 7
- NVM 설치 in Raspberry Pi
- Node.js 설치와 OBCon SCADA 재구성
- Socket.IO Server
- Socket.IO Client
- Nginx with Socket.IO
- 참고 문헌
- Export/Import
- 주의 사항
- Default Export/Import
- Named Export/Import
- 동적 import
- 기타 Export/Import
- 실행 순서
- ECMAScript Modules 환경으로 변환
Nodejs
Cluster
PM2
Thread
nodejs_thread.md 파일 참조
NVM 설치 in Window 10
"설정 > 앱 > 프로그램 및 기능" 메뉴에서 설치된 Node.js를 삭제 한다.
NVM 1.1.7 설치
https://github.com/coreybutler/nvm-windows/releases 사이트에 접속 한다.
nvm-setup.zip 파일을 다운로드 한다.
압축 파일을 푼 후, nvm-setup.exe 파일을 실행하여 nvm을 설치 한다.
Nodejs 버전 확인용 URL : https://nodejs.org/ko/download/releases/
#--- NVM 1.1.7 설치 확인
nvm --version
NVM 설치 in CentOS 7
NVM(Node Version Manager)를 사용하여 설치 한다.
주의: Nodejs 재설치시 global로 설치된 것은 다시 설치하여야 한다.
#--- NVM 0.35.2 설치
cd ~
yum -y install gcc g++ make
curl -o- curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.35.2/install.sh | bash
source ~/.bashrc
nvm --version
NVM 설치 in Raspberry Pi
#--- NVM 0.35.3 설치
cd ~
apt install build-essential
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
# curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
source ~/.bashrc
nvm --version
#--- NVM 0.35.3 설치 for Raspberry Pi 4 Model B
#--- 기존에 설치되어 있는 nodejs 삭제
apt remove --purge npm node-* nodejs-* libnode-dev libnode64
cd ~
git clone https://github.com/nvm-sh/nvm.git .nvm
cd ~/.nvm
git checkout v0.35.3
cd ..
vi ~/.bash_profile
export NVM_DIR="$HOME/.nvm"
. "$NVM_DIR/nvm.sh"
. "$NVM_DIR/bash_completion"
source ~/.bash_profile
nvm --version
#--- Python 2.7
Node.js 설치와 OBCon SCADA 재구성
#--- Nodejs 12.13.1 (Erbium LTS) 설치, npm 6.12.1
nvm list available #--- 사용 가능한 Node.js 버전 확인 in Windows
nvm ls-remote #--- 사용 가능한 Node.js 버전 확인 in Linux
#--- v15.2.1 in Windows, KT UCloud, CentOS 7
#--- v14.15.1 LTS(Fermium) in Windows, KT UCloud, CentOS 7
#--- 2020-10-27 LTS로 승격
#--- JavaScript Engine V8.1 장착
#--- v12.14.1 in CentOS 7
#--- v12.13.1 in Windows 10, KT UCloud, Raspberry Pi 4
#--- ??? in Raspberry Pi 3
nvm ls
nvm install v12.13.1
nvm use 12.13.1 #--- 특정 버전의 nodejs 사용 설정
nvm alias default 12.13.1 #--- Linux에서 Default 설정
node --version
npm -v
#--- OBCon SCADA에서 nodejs 재설치
cd c:/work/obcon/obcon
rm -rf node_modules
npm install
npm install -g mocha
npm install -g uglify-js
npm install -g pm2
Socket.IO Server
Socket.IO 설치
npm install --save socket.io
npm install --save socket.io-client
Socket.IO 서버 코드
Default URL Path : /socket.io/
let http = require('http'); //--- HTTP Server 모듈
let express = require('express'); //--- Express 모듈
//--- https://www.npmjs.com/package/socket.io
let Socketio = require('socket.io'); //--- Socket.IO 모듈
let app_http = express(); //--- Express
let app_http_server = http.createServer(app_http); //--- HTTP Application
// let io = Socketio(app_http_server); //--- Socket.IO
let io = Socketio(app_http_server, {
path: '/socket.io', //--- Default. /socket.io
transports: ['polling','websocket']
});
//--- Socket.IO 코드
io.use((socket, next) => {
let token = socket.handshake.query.token;
// let clientId = socket.handshake.headers['x-clientid'];
if (isValid(token)) {
return next();
}
return next(new Error('authentication error'));
});
io.on('connection', socket => { //--- 접속시 호출
let token = socket.handshake.query.token;
console.log('Socketio :: socketio is connected.');
socket.on('disconnect', () => { //--- 종료시 호출
console.log('Socketio :: socketio is disconnected.');
});
//--- 수신
socket.on('채널', (msg) => {
//--- 송신
socket.emit('채널', rtMsg);
socket.broadcast.emit('채널', rtMsg);
});
});
//--- Application Server listening
app_http_server.listen(
{ hostname: '127.0.0.1', port: 80, agent: false },
function () {
console.log('Application Server on listening');
}
);
Socket.IO Client
https://github.com/socketio/socket.io-client
브라우저용 JavaScript 파일: node_modules/socket.io-client/dist/socket.io.js
API : https://github.com/socketio/socket.io-client/blob/master/docs/API.md
Default URL Path : /socket.io/
Nginx with Socket.IO
OBCon : 443 port/tcp
OBCon SCADA : 80 port/tcp
OBCon SCADA : 85 port/tcp
//--- OBCon Nginx
server {
listen 80;
listen [::]:80;
server_name obcon.biz www.obcon.biz;
return 301 https://www.obcon.biz$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name obcon.biz www.obcon.biz;
ssl_certificate /etc/nginx/obcon.crt;
ssl_certificate_key /etc/nginx/obcon.key;
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:1m;
ssl_protocols SSLv3 TLSv1; # SSLv2
ssl_ciphers ALL:!aNull:!eNull:!SSLv2:!kEDH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+EXP:@STRENGTH;
ssl_prefer_server_ciphers on;
location /scada/ {
proxy_no_cache 1;
proxy_pass http://211.252.87.34:80;
}
location /default/ {
proxy_no_cache 1;
proxy_pass http://211.252.87.34:80;
}
location /service_scada_obcon/ {
proxy_no_cache 1;
proxy_pass http://211.252.87.34:80;
}
}
//--- OBCon SCADA Nginx
server {
listen 80;
listen [::]:80;
server_name obcon.biz www.obcon.biz;
location /scada/ {
proxy_no_cache 1;
proxy_pass http://127.0.0.1:85;
}
}
cd /usr/share/nginx/html
ln -s /work/appl/obcon/themes/default/ default
ln -s /work/appl/obcon/themes/service_scada_obcon/ service_scada_obcon
참고 문헌
Export/Import
주의 사항
import 문은 항상 파일의 최상위에서 사용 한다.
중간에 선언하더라도 최상위에서 실행 된다.
from 뒤는 문자열만 가능 하다.
실행 프로그램은 aync 함수에서 호출되므로 최상위에 await문을 사용할 수 있다.
Default Export/Import
// module.exports = conf;
//--- Sample
export default expression;
export default function (~) { ~ };
export default function name1(~) { ~ };
export { name1 as default, ~ };
import defaultMember, { member ~ } from "~";
import defaultMember, * as alias from "~";
import defaultMember from "~";
Named Export/Import
//--- Sample
export const name1, name2, ~, nameN;
export const name1 = ~, name2 = ~, ~, nameN;
export function functionName(){...}
export class ClassName {...}
export { name1, name2, ..., nameN };
export { variable1 as name1, variable2 as name2, ..., nameN };
export const { name1, name2: bar } = o;
import * as obj from "~"; //--- 모듈 전체를 import
import obj from "~"; //--- 모듈 전체를 import
import { member } from "~";
import { member as alias } from "~";
import { member1, member2 } from "~";
import { member1, member2 as alias2, [...] } from "~";
동적 import
include/require.js 파일 참조
const importModule = await import(~);
const defaultMember = importModule.default;
import(~)
.then(obj => { ~ })
.catch(err => { ~ });
기타 Export/Import
import "~"; //--- 실행만 한다.
실행 순서
ECMAScriptModules 환경에서 프로그램 실행 순서
async internal/modules/run_main, handleMainPromise
async internal/process/esm_loader, loadESM
async internal/modules/esm/loader, ESMLoader.import
async Promise.all
internal/modules/esm/module_job, ModuleJob.run
~.js
ECMAScript Modules 환경으로 변환
'module.export ='를 'export default'로 변경 한다.
include/require.js를 먼저 import 한다.
require(
)를 await require() 변경 한다.내부에 await를 사용하는 함수 앞에 async를 붙인다.
async가 붙은 함수를 호출하는 경우, await를 붙인다.
utils.getClass
utils.getModule
동적으로 require()를 호출하는 경우, 최종 파일을 읽어오는지 추가 확인이 필요 하다.