Using Node modules - composite/nw.js GitHub Wiki

node.js λŠ” 3κ°€μ§€ λ°©μ‹μ˜ λͺ¨λ“ˆμ΄ μžˆμŠ΅λ‹ˆλ‹€.

  • λ‚΄μž₯ λͺ¨λ“ˆ (Node API λΆ€λΆ„)

  • JavaScript둜 λ§Œλ“  타사 λͺ¨λ“ˆ

  • C/C++ 둜 λ§Œλ“  λ„€μ΄ν‹°λΈŒ 타사 λͺ¨λ“ˆ

이듀을 λͺ¨λ‘ nw.js μ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ°Έκ³ :   node.js wiki에 기재된 β€œλͺ¨λ“ˆβ€ μ΄λ‚˜, npm 검색 으둜 찾은 λͺ¨λ“ˆ λ“±μœΌλ‘œ λ‹€μ–‘ν•œ μ˜€ν”ˆ μ†ŒμŠ€ λͺ¨λ“ˆμ„ μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ‚΄μž₯ λͺ¨λ“ˆ

node.js λ‚΄μž₯ λͺ¨λ“ˆμ€ 별닀λ₯Έ κ³Όμ • 없이 node.js λ°©μ‹μœΌλ‘œ μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λͺ¨λ“ˆ μΌλžŒμ€ API λ¬Έμ„œλ₯Ό μ°Έκ³ ν•˜μ„Έμš”.

예λ₯Ό λ“€λ©΄, var fs = require('fs') μœΌλ‘œ νŒŒμΌμ‹œμŠ€ν…œ λͺ¨λ“ˆμ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ˜λ‹€λ₯Έ 예둜 require(…) 같은 별도 첨뢀 없이 λ°”λ‘œ process λͺ¨λ“ˆμ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ node.js API와 nw.js APIκ°€ μ•½κ°„ 차이점이 μžˆμŠ΅λ‹ˆλ‹€. μžμ„Έν•œ 사항은 node.js 와 nw.js API 차이점을 μ°Έκ³ ν•˜μ„Έμš”.

타사 μžλ°”μŠ€ν¬λ¦½νŠΈ λͺ¨λ“ˆ

λ§Œμ•½ 타사 λͺ¨λ“ˆμ΄ λ„€μ΄ν‹°λΈŒ 없이 순수 μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œλ§Œ μ§œμ—¬μ§„ λͺ¨λ“ˆμ΄λΌλ©΄, λ°”λ‘œ nw.js μ—μ„œ require('moduleName') λ°©μ‹μœΌλ‘œ μ²¨λΆ€ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ μƒλŒ€ κ²½λ‘œλŠ” 앱에 μžˆλŠ” λΆ€λͺ¨ κ²½λ‘œκ°€ μ–΄λ–€ 방식을 쓰냐에 따라 λ‹¬λΌμ§‘λ‹ˆλ‹€.

  • require() λ₯Ό μ‚¬μš©ν•  경우, λΆˆλŸ¬μ˜€λŠ” μžμ‹μ„ κ°€μ Έμ˜¬ λ•Œ μƒλŒ€ κ²½λ‘œλŠ” require() λ₯Ό μ‚¬μš©ν•œ 파일 κΈ°μ€€μœΌλ‘œ κ²°μ •λ©λ‹ˆλ‹€.

  • λ§Œμ•½ μ›Ήν‚€νŠΈ 기반 μ‹œμŠ€ν…œμ—μ„œ λ‹€λ₯Έ 파일 경둜λ₯Ό 뢈러올 경우 (window.open(), XMLHttpRequest, <script src="..."> λ“± μ›Ήμ—μ„œ μ“°μ΄λŠ” μ™ΈλΆ€ 경둜 μ‚¬μš© κΈ°λŠ₯) μƒλŒ€ κ²½λ‘œλŠ” μ•± μ΅œμƒμœ„ κ²½λ‘œλΆ€ν„° μ‹œμž‘ν•©λ‹ˆλ‹€.

μ „μžμ˜ λœ»μ€ λͺ¨λ“  node.js λͺ¨λ“ˆμ˜ ν•˜μœ„ λͺ¨λ“ˆκ³Όμ˜ μ •ν™•ν•œ 연동을 μœ„ν•œ κ·œμΉ™μž…λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ 보톡 ../, ./ λ“±μ˜ λͺ…μ‹œμ  ν•˜μœ„ 경둜λ₯Ό 잘 μ•ˆμ“°μ£ . λŒ€μ‹ , κ·Έλƒ₯ require('modulename') μ΄λ ‡κ²Œ λΆ€λ₯΄λŠ” 것 만으둜 μΆ©λΆ„ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ 앱에 μžˆλŠ” /node_modules ν΄λ”μ˜ ν•˜μœ„ 폴더λ₯Ό μ°Ύμ•„ ꡬ동할 ν…Œλ‹ˆκΉŒμš”. (μžμ„Έν•œ API 호좜 κ΅¬μ‘°λŠ” β€œnode_modules ν΄λ”μ—μ„œ λͺ¨λ“ˆ λΆˆλŸ¬μ˜€κΈ°β€ μ„Ήμ…˜μ„ μ°Έκ³ ν•˜μ„Έμš”.)

예λ₯Ό λ“€λ©΄, npm νŒ¨ν‚€μ§€λ₯Ό 톡해 npm install modulename μ΄λ ‡κ²Œ μ„€μΉ˜ λͺ…령을 내리면 (λ§€λ‹ˆνŽ˜μŠ€νŠΈκ°€ μžˆλŠ” μ•± 폴더라면) μžλ™μœΌλ‘œ /node_modules λΌλŠ” ν•˜μœ„ 폴더λ₯Ό λ§Œλ“€κ³  거기에 λͺ¨λ“ˆμ„ μ„€μΉ˜ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

μ˜ˆμ‹œ: async

async λͺ¨λ“ˆμ— λŒ€ν•œ μ„€μΉ˜ 예λ₯Ό λ“€κ² μŠ΅λ‹ˆλ‹€.

$ cd /path/to/your/app
$ npm install async

μ΄λ ‡κ²Œ ν•˜λ©΄ 파일 κ΅¬μ‘°λŠ” μ΄λ ‡κ²Œ λ‚˜μ˜€κ²Œ λ˜κ² μŠ΅λ‹ˆλ‹€.

$ find .
.
./package.json
./index.html
./node_modules
./node_modules/async
./node_modules/async/.gitmodules
./node_modules/async/package.json
./node_modules/async/Makefile
./node_modules/async/LICENSE
./node_modules/async/README.md
./node_modules/async/.npmignore
./node_modules/async/lib
./node_modules/async/lib/async.js
./node_modules/async/index.js

그리고 μ•± λ§€λ‹ˆνŽ˜μŠ€νŠΈ(./package.json) κ΅¬μ‘°λŠ” μ΄λ ‡κ²Œ λ‚˜μ˜€κ² μ£ .

{
  "name": "nw-demo",
  "main": "index.html"
}

index.html 파일 μ˜ˆμ œμž…λ‹ˆλ‹€.

<html>
<head>
<title>test</title>
<script>
var async=require('async');
</script>
</head>
<body>
ν…ŒμŠ€νŠΈκ°€ μž‘λ™λ˜μ–΄μ•Ό κ² μ£ .
</body>
</html>

C/C++ 둜 이루어진 λ„€μ΄ν‹°λΈŒ 타사 λͺ¨λ“ˆ

C/C++ ν™•μž₯이 ν¬ν•¨λœ λͺ¨λ“ˆμ˜ 상황이라면 μ–˜κΈ°κ°€ μ’€ λ‹¬λΌμ§‘λ‹ˆλ‹€. 쑰금 λ³΅μž‘ν•΄μ§€μ£ . μ™œλƒλ©΄ nw.js의 ABI(μ•± 이진 μΈν„°νŽ˜μ΄μŠ€; application binary interface)와 nw.js ABI ꡬ쑰에 쑰금 차이가 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

node.js μ—μ„œ npm install μ΄λ ‡κ²Œ λͺ¨λ“ˆμ„ μ„€μΉ˜ν•˜λ©΄ npm 은 자체 λ‚΄μž₯된 node-gyp 을 ν†΅ν•˜μ—¬ μ†ŒμŠ€λ₯Ό λΉŒλ“œν•  κ²ƒμž…λ‹ˆλ‹€.

nw.jsμ—μ„œ λΉŒλ“œν•˜λ €λ©΄ nw-gyp (nw.jsμ—μ„œ μ‚¬μš© κ°€λŠ₯ν•œ node-gyp) κ°€ ν•„μš”ν•©λ‹ˆλ‹€. 그리고 nw-gyp λ₯Ό 직접 μ‹€ν–‰ν•΄μ•Ό ν•˜μ£ . npm 이 node.js κΈ°λ°˜μΈμ§€ nw.js κΈ°λ°˜μΈμ§€ λͺ¨λ₯΄κ±°λ“ μš”.

nw-gyp λ₯Ό μ„€μΉ˜ν•˜κ³ μž ν•œλ‹€λ©΄, npm install nw-gyp -g λͺ…λ Ήμ–΄ ν•œ 쀄이면 λ©λ‹ˆλ‹€.

μ‚¬μš© 전에 λ°˜λ“œμ‹œ μš”κ΅¬μ‚¬ν•­ (파이썬 μ—”μ§„κ³Ό C/C++ μ»΄νŒŒμΌλŸ¬κ°€ ν•„μš”ν•©λ‹ˆλ‹€)을 λ°˜λ“œμ‹œ ν™•μΈν•˜μ„Έμš”. κ·Έλ ‡λ‹€κ³  node-gyp와 μ „ν˜€ λ‹€λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

nw.js 을 μœ„ν•œ λͺ¨λ“ˆμ„ λΉŒλ“œν•˜λ €λ©΄, npm νŒ¨ν‚€μ§€ μ„€μΉ˜ν•  λ•Œ μ•Œμ•„μ•Ό ν•  점은, 이미 λ¨Όμ € npm install modulename λͺ…λ Ήμ–΄λ‘œ λΉŒλ“œ ν›„ μ„€μΉ˜ν–ˆλ‹€λ©΄, nw-gyp rebuild --target=0.5.0 λͺ…λ Ήμ–΄λ‘œ λ‹€μ‹œ λΉŒλ“œλ₯Ό ν•΄μ•Ό ν•©λ‹ˆλ‹€.

λ‹€λ₯Έ λ°©λ²•μœΌλ‘œ Github 같은 곳의 λͺ¨λ“ˆμ˜ μ†ŒμŠ€λ₯Ό λ°›μ•„λ‚Έ ν›„ ν•΄λ‹Ή 폴더에 nw-gyp rebuild --target=0.5.0 λͺ…λ Ήμ–΄λ₯Ό 싀행해도 λ©λ‹ˆλ‹€.

이 μ„œλ‘œ κ°„μ˜ λŒ€μ²΄λ²•μ„ μˆ˜ν–‰ν•  λ•Œ,

  • nw-gyp κ°€ λ°˜λ“œμ‹œ λͺ¨λ“ˆ 내에 binding.gyp 파일이 μžˆλŠ” μƒμœ„ 폴더 λ‚΄μ—μ„œ μ‹€ν–‰ν•˜μ—¬μ•Ό ν•©λ‹ˆλ‹€.

  • nw.js μœΌλ‘œλΆ€ν„° nw-gyp μž¬λΉŒλ“œμ‹œ nw.js 버전을 λ°˜λ“œμ‹œ λͺ…μ‹œν•΄μ•Ό ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€λ©΄ nw.js 버전이 0.5.0 이라면 nw-gyp rebuild --target=0.5.0 이런 μ‹μœΌλ‘œ λͺ…λ Ήμ–΄λ₯Ό μˆ˜ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€. nw-gypλŠ” 버전을 감지할 수 μžˆλŠ” κΈ°λŠ₯이 μ—†μŠ΅λ‹ˆλ‹€.

  • nw.js μ‹ κ·œ 버전에 λ„€μ΄ν‹°λΈŒ λͺ¨λ“ˆμ„ κ΅¬λ™ν•˜λ €λ©΄ λ˜λ‹€μ‹œ μž¬λΉŒλ“œλ₯Ό ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ΄λŠ” ABIκ°€ 버전간 μ„œλ‘œ λ‹€λ₯΄κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

    • node-webkit 0.6.0 κ°€ μΆœμ‹œλœ ν›„, nw-gyp rebuild --target=0.6.0 λͺ…λ Ήμ–΄ 싀행이 ν•„μš”ν•˜κ³ ,
    • node-webkit 0.6.1 이 μΆœμ‹œλœ ν›„, nw-gyp rebuild --target=0.6.1 λͺ…λ Ήμ–΄ 싀행이 ν•„μš”ν•˜κ³ ,
    • λ‹€μŒμ— λ‚˜μ™€λ„ λ°˜λ³΅ν•΄μ•Ό ν•˜μ£ .

이 ABI 의 차이둜 인해 λ„€μ΄ν‹°λΈŒ λͺ¨λ“ˆμ€ node.js 와 nw.js κ°„μ˜ ν˜Έν™˜μ„±μ΄ μ „ν˜€ μ—†μŠ΅λ‹ˆλ‹€. 즉, nw-gyp둜 λΉŒλ“œν•œ λͺ¨λ“ˆμ„ node.js 에 ꡬ동할 수 μ—†μœΌλ©°, node-gyp 둜 λΉŒλ“œν•œ λ„€μ΄ν‹°λΈŒ λͺ¨λ“ˆ λ˜ν•œ λ°˜λŒ€λ‘œ nw.js μ—μ„œ ꡬ동할 수 μ—†λ‹€λŠ” 뜻이 λ©λ‹ˆλ‹€.

예λ₯Ό λ“€λ©΄, node.js λ„€μ΄ν‹°λΈŒ λͺ¨λ“ˆμ΄ ν¬ν•¨λœ 앱을 node test.js 및 npm test 을 톡해 ꡬ동할 수 μžˆμœΌλ‚˜, nw.js 에 λΉŒλ“œλœ λ„€μ΄ν‹°λΈŒ λͺ¨λ“ˆμ€ κ΅¬λ™λ˜μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€. (μ–‘μͺ½ λ‹€ μ•„μ΄λŸ¬λ‹ˆν•œ 였λ₯˜λ₯Ό λ‚΄κ±°λ‚˜ 엔진이 νŒ…κΈ°λŠ” ν˜„μƒμ΄ μΌμ–΄λ‚©λ‹ˆλ‹€.)

μ€‘μš”μ‚¬ν•­ 1: μœˆλ„μš° λ°°ν¬λ³Έμ—μ„œ λ„€μ΄ν‹°λΈŒ λͺ¨λ“ˆμ„ μ •μƒμ μœΌλ‘œ 돌리고자 ν•œλ‹€λ©΄, 핡심 μ‹€ν–‰ 파일인 nw.exe 의 파일λͺ…을 μ ˆλŒ€λ‘œ λ°”κΎΈμ§€ 말아야 ν•©λ‹ˆλ‹€. μ΄λŠ” 엔진이 ꡬ동을 μœ μ§€ν•˜κΈ° μœ„ν•œ 핡심 파일이기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

μ€‘μš”μ‚¬ν•­ 2: μœˆλ„μš°μ—μ„œλŠ” μ•„λ§ˆ PATH ν™˜κ²½λ³€μˆ˜μ— 파이썬 λŸ°νƒ€μž„ κ²½λ‘œκ°€ ν¬ν•¨λ˜μ–΄μ•Ό ν•  κ²ƒμž…λ‹ˆλ‹€. (μ£Ό: node-gyp 및 nw-gypλŠ” 파이썬 슀크립트λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.)

μ€‘μš”μ‚¬ν•­ 3: nw-gyp λŠ” node-gyp μ—μ„œ λΉŒλ“œλœ .node νŒŒμΌμ„ λ³€κ²½ν•œλ‹€λŠ” 사싀을 μžŠμ§€ λ§ˆμ‹­μ‹œμ˜€. (node.js λŒ€μ‹  nw.js 을 μ“°κΈ° μœ„ν•΄ μ»΄νŒŒμΌν•˜λŠ” μ‹œμŠ€ν…œμ΄κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.)

μ’€ 더 μžμ„Έν•œ 사항 및 λ¬Έμ œλŠ” (μ œν•œ 사항 및 μ•Œλ €μ§„ 문제점 λ“±), β€œnw-gyp둜 λ„€μ΄ν‹°λΈŒ λͺ¨λ“ˆ λΉŒλ“œν•˜κΈ°β€ νŽ˜μ΄μ§€λ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

⚠️ **GitHub.com Fallback** ⚠️