- 6
- Seia
- 조회 수 525
오늘은 간단한 질문하고 갑니다. 아직도 숙제가 안 풀렸어요 ㅠㅠ
Node.JS 환경입니다. 디스코드 봇을 개발 중인데.. (링크 업데이트됨) https://github.com/seriumium/seriumium/
다국어 지원에서 아직은 아이디어가 없어서 어쩔 수 없이 유동 require을 쓰고 있어요.........
혹시 문법을 모두 지키며 현재까지 간단하게 다국어지원을 구현할 수 있는 방법이 있을까요?
위 깃헙에서 /store/i18n 이 아마 번역된 것일 껍니다... ..... . . .. .
message 이벤트는 빨라야 하기 때문에 index.js에 두었는데 index.js에서 유동 require가 사용된 것을 볼 수 있답니다.....
덕분에 응답시간이 20ms 초반에서 40ms로 뒤쳐졌네요.
아직은 별다른 아이디어가 없고 새롭게 구조조정(?) 중 입니다.
작성자
댓글 6
NodeJS의 경우 시작 시에 require 된 모든 파일을 캐싱합니다. 그래서 한번 실행되고 파일이 바뀌더라도 정적 파일이 아닌 이상 변경사항이 적용되지 않습니다. 그리고 동적 require에 비해 정적 require가 훨씬 메모리도 덜 잡아먹어서 빠릅니다. 제가 require를 사용한 이유는 모듈화 그리고 직관성 때문인데 모듈화를 했을 때는 어떤 파일에서 오류가 발생했는지 쉽게 알 수 있었어요.
번역에 대해서는 어떻게 해야 할지 몰라서 O***U님의 조언 들어가며 했습니다. 이미 현업에서 활동하시는 고등학생 분이라서 참고했는데 저는 i18n 예제를 받았음에도 불구하고도 효율적으로 처리할 수 있는 구조가 뭔지 자세히 모르겠습니다. class에 같은 경우에는 제가 아직 다 익히지 못한 점도 있고 더욱 자세히 알아봐야 하지 않을까 싶네요. 답변 감사합니다.~
...???
제가 답변을 달았을 때 당시의 코드에는 정적 require이 아닌 동적 require이 사용되어, 제가 정적 require을 사용해라고 말씀드린건데요?
음.. 그런가요. 늦은 답변 죄송합니다;
지금은 이전보다 약 60ms 정도 더 빠른 성능을 기록하고 있습니다. 집에서도 200ms 전후였네요.
*다음은 업데이트된 코드입니다. https://github.com/Seriumium/seriumium/blob/nightly/index.js
try {
if (message.channel.type === 'dm') return
if (message.channel.permissionsFor(message.author).has('MANAGE_GUILD')) { permissions = 2 } else { permissions = 0 }
if (message.author.id === '324541397988409355') permissions = 4
prompt = prompts.names.get(message.content.split(' ')[0].slice(endpoints.prefix.length))
notAllowed =
(message.author.bot)
|| (message.channel.type === 'dm')
|| (!message.content.startsWith(endpoints.prefix))
|| (!prompt)
|| (permissions < prompt.permissions)
if (notAllowed) { return }
cache.first = message.content.split(' ')[0].slice(endpoints.prefix.length)
cache.second = prompts.languages.get(cache.first)
nt = {
arguments: message.content.split(' ').slice(1),
translations: prompts.translations.get(cache.second),
permissions: permissions
}
prompt.execute(client, message, nt)
} catch (error) {
console.error(error)
}
코드를 보니 index.js 파일에 언어 세팅을 다 때려 박으셨는데...
제가 예제 하나 보내드릴게요. 한번 확인해 보세요.
그리고 추가적으로 restdot이라는 rest api 레벨 데이터베이스 프로젝트도 진행하고 있는데 한번 정도 코드 확인 가능하신가요;
디스코드 봇은 제대로 만들어 본 적이 없어서, 어떤식으로 응답이 오고, 어떤식으로 응답을 보내야 하는지는 모르겠지만...
제 짧은 눈으로 보면.. message 이벤트가 있을때마다 require이 실행되니 속도가 느린게 아닐까 싶습니다.
실행 직후 store/i18n 안에 있는 모든 json 파일을 불러서 전역변수로 설정을 하던지,
아니면 따로 i18n 클래스를 만들어서 lang("error_404", "en") 이런식으로 불러오게 만들던지 하면 되지 않을까 싶네요.
물론 국제화 클래스를 불러올때 지원하는 모든 언어를 모두 메모리에 박아두고 불러오게 하거나,
한번이상 요청한 언어는 메모리에서 지우거나 새로 불러오지 않게 만들면 되지 않을까요.