어떻게 node. js 와 브라우저 간에 코드를 공유할 수 있습니까?

말씀이있었노라 내가 작은 JavaScript 로 프로그램을 사용하여 웹 소켓 서버, 클라이언트 (브라우저에서 실행하십시오) 와 node. js 통신.

클라이언트와 서버 간에 코드를 공유하고 싶습니다. 나는 단지 지금 막 시작한 node. js 저의 지식이 JavaScript 는 가장 작은 녹슨, 말할 수 있다. 그래서 난 아직 머리는요 가져오는 콩몽이스 주변에 필요한 () 함수. # 39, & # 39 export& 사용하여 만들 경우, 나는 내 패키지 그럼 내가 어떻게 JavaScript 객체, 동일한 브라우저에서 볼 수 없는 파일을 사용할 수 있습니다.

I want to 세트를 만드는 방법 및 클래스뿐만 양쪽 모두에 사용되는 메시지 및 기타 대칭복사된 인코딩 및 디코딩 할 수 있습니다. 그러나 Node.js/CommonJS 패키징에서는 대비하기 위해 JavaScript 에서 사용할 수 있는 파일 시스템을 만드는 양쪽에 날 것 같다.

난 또 이스윈클레스 사용하여 더 얻을 수 있기 때문에 포기한 적이 있지만, 난 내가 couldn& OO 모델 t # 39, 제공된 JavaScript 파일을 볼 수 있는 방법을 사용할 수 있는 장비가 필요한 (). 뭐, 제가 내가 누각되었습니다 여기서요?

질문에 대한 의견 (1)
해결책

둘 다 사용할 수 있는 클라이언트 및 서버 모듈을 쓸 스케쳐내 때는기대어 때는기대어, I have a 파선-짧은 블로그 포스트에 빠르고 간편한 방법: 먹어서나 및 브라우저에 대한 node. js , 기본적으로 다음과 같은 (여기서 '이' 는 '윈도' 동일합니까):

(function(exports){

    // Your code goes here

   exports.test = function(){
        return 'hello world'
    };

})(typeof exports === 'undefined'? this['mymodule']={}: exports);

또는 node. js API 를 구현할 수 있는 몇 가지 프로젝트를 클라이언트상의 있다 (예: marak& # 39 의 제미니.

다노데 관심을 갖게 될 수도 있습니다 수 있는 기업을 자바스크립트 함수를 호출할 수 있도록 간단한 json 기반 사용하여 다른 컴퓨터 네트워크 프로토콜.

해설 (9)

에펠리 더 없이 좋은 솔루션이 바로 여기에 있다 (http://epeli.github.com/piler/) 는 그냥 이거 파일로 샤레트제스 불렀으매 라이브러리와는

(function(exports){

  exports.test = function(){
       return 'This is a function from shared module';
  };

}(typeof exports === 'undefined' ? this.share = {} : exports));

서버 측에서 됩니다.

var share = require('./share.js');

share.test();

그냥 읽어들입니다 js 파일을 클릭한 다음 사용 및 클라이언트 측에서

share.test();
해설 (3)

Jquery 체크아웃합니다 이 일을 할 수 있는 소스 코드를 node. js 모듈에서는 패턴, AMD 모듈에서는 패턴, 글로벌 브라우저에서:

(function(window){
    var jQuery = 'blah';

    if (typeof module === "object" && module && typeof module.exports === "object") {

        // Expose jQuery as module.exports in loaders that implement the Node
        // module pattern (including browserify). Do not create the global, since
        // the user will be storing it themselves locally, and globals are frowned
        // upon in the Node module world.
        module.exports = jQuery;
    }
    else {
        // Otherwise expose jQuery to the global object as usual
        window.jQuery = window.$ = jQuery;

        // Register as a named AMD module, since jQuery can be concatenated with other
        // files that may use define, but not via a proper concatenation script that
        // understands anonymous AMD modules. A named AMD is safest and most robust
        // way to register. Lowercase jquery is used because AMD module names are
        // derived from file names, and jQuery is normally delivered in a lowercase
        // file name. Do this after creating the global so that if an AMD module wants
        // to call noConflict to hide this version of jQuery, it will work.
        if (typeof define === "function" && define.amd) {
            define("jquery", [], function () { return jQuery; });
        }
    }
})(this)
해설 (1)

꼭 이래야겠어요 추천합니까 보았으매 꽂으십시오 [레키레이스 어댑터용 node. js] (http://requirejs.org/docs/node.html). 문제는 콩몽이스 모듈에서는 node. js 는 기본적으로 패턴화합니다 isn& # 39, t, 비동기적입니다 수 있는 웹 브라우저에서 로드중. 레키레이스 soundmixer. AMD 서버 및 클라이언트, 패턴, 이는 모두 모두 비동기적입니다 및 호환됩니까 deltamove) 을 사용하면 '레지널드제스' 어댑터입니다.

해설 (1)

39 don& JavaScript 소스 코드를 문자열 t forget 함수은 seabreeze 표현한 것으로, 해당 함수에 대해. 간단히 만들 수 있는 기능 및 구성자를 운행에서어떠한 캡슐화됩니다 & # 39 보낼 수 있도록 toString (), d, 클라이언트입니다.

또 다른 방법으로 코드를 사용하는 것이 일반적인 파일, 그리고 별도의 시스템 구축, 동일팔레트에 포함시킬 서버와 클라이언트 스크립트입니다. # 39 m, 이를 이용하여 i& 외곽진입 단순 있는 웹 소켓 통한 게임 클라이언트 / 서버 및 클라이언트 서버 및 클라이언트 서버 동기화 본질적으로 같은 게임 루프 실행하십시오 모두 사용할 수 있도록 모든 틱 nobody& # 39 의 최대 관심사가 됐다.

이 게임은 내 시스템을 구축하는 것은 단순한 [Bash] [1] 를 통해 실행되는 스크립트를 C 언어 전처리기 거쳐 일부 정크 cpp 파일을 sed, 그래서 난 뒤에 클린업합니다 찻입 # include # define # 이프데프 등의 일반 전처리기 물건을 모두 이용할 수 있다,, etc.

[1]: http://en.wikipedia.org/wiki/Bash_% 28Unix_shell% 29

해설 (1)

아닐 수도 있지만, 문제는 완전히 발맞춰 생각해봤죠 I& 공유하지는; d # 39 이.

내가 원하는 기능을 할 수 있는 몇 가지 간단한 문자열 유틸리티에는 스트린고드프로토티페, 모두 사용할 수 있으며 브라우저가 노드입니다 선언했다. 내가 그냥 파일에 이러한 기능을 유지할 수 있고 쉽게 참조입니다 티리티s.j스 불렀으매 (받을시간은 하위 폴더) 에서 다 내 있지만브라우저에 코드를 사용하여 스크립트입니다 태그번호 필요한 (스이스 생략할 확장명으로) 내 node. js 스크립트입니다.

my_node_script.js

var utilities = require('./static/js/utilities')

my_browser_code.html

<script src="/static/js/utilities.js"></script>

이것은 나에게 유용한 정보가 아닌 다른 사람이 됐으면 좋겠다 "고 말했다.

해설 (3)
  • 웹팩 * 모듈에서는 같은 경우 들러 사용하여 JavaScript 파일을 번들하기 사용, 브라우저에 대한 프론트엔드 브라우저에서 실행되는 너회의 node. js 모듈에서는 재사용합니다 됩니다. 즉 너회의 node. js 모듈에서는 node. js 와 브라우저 간에 공유할 수 있습니다.

예를 들어, 다음과 같은 코드를 수마리아스 있습니다.

일반 node. js 모듈에서는: 수마리아스

const sum = (a, b) => {
    return a + b
}

module.exports = sum

List. 모듈에서의 node. js

const sum = require('path-to-sum.js')
console.log('Sum of 2 and 5: ', sum(2, 5)) // Sum of 2 and 5:  7

It 에 재사용합니다 프론트엔드

import sum from 'path-to-sum.js'
console.log('Sum of 2 and 5: ', sum(2, 5)) // Sum of 2 and 5:  7
해설 (0)

단순히 JavaScript 소스 파일을 보낼 수 있는 클라이언트 서버 (브라우저) 그러나 재주, 미니 &quot exports&quot 클라이언트뿐 입력해야 합니다. 먼저 '환경' 실행 코드를 저장하고 이를 모듈에서는.

이러한 환경은 간편하게 사용할 수 있도록 마감. 예를 들어 http 를 통해 'like' (http://example.com/js/foo.js) 는 소스 파일을 서버에. 브라우저 및 읽어들입니다 스믈하트프리퀘스트 같은 코드를 통해 필요한 파일을 로드할 수 있습니다.

ajaxRequest({
  method: 'GET',
  url: 'http://example.com/js/foo.js',
  onSuccess: function(xhr) {
    var pre = '(function(){var exports={};'
      , post = ';return exports;})()';
    window.fooModule = eval(pre + xhr.responseText + post);
  }
});

중요한 것은 즉시 실행할 수 있는 해외 랩 클라이언트입니다 익명의 코드 분할 함수 (폐쇄) 를 만들 수 있는 &quot exports"; 그렇게 되돌려줍니다 you& 객체와 같은 위치를 지정할 수 있습니다; d # 39 오염시키는 것이 아니라 글로벌 이름공간이. 이 예에서는 이 할당되었는지 포모두리 '속성' 창 '를 통해 익스포트되지 코드를 포함할 파일을 포오이스'.

해설 (2)

어느 누구도 이 시스템을 이전 솔루션에서 콩몽이스 모듈에서는 있지만브라우저에.

또 다른 대답을 언급한 바와 같이 가지 asset manager / 패키저 등의 솔루션을 브라우세리피 또는 파일러 그런데 이 RPC 와 같은 솔루션을 다노데 또는 노이스.

하지만 난 couldn& # 39, t 찾습니다찾기 콩몽이스 구현한 브라우저에 대한 비롯한 '필요한 ()' 기능을 '/' 와 '익스포트를 모두레드릭스포르츠' 객체에는 등). 그래서 내가 내 스스로 그 다른 사람이 쓴 적이 있는 경우에만 작성했습니까 발견하십시오 나보다 더 잘 했다. https://github.com/weepy/brequire. # 39 의 불렀으매 it& 브레키어 (파선-짧은 브라우저 합니다).

대부분의 개발자들이 요구를 맞추기, 에셋을 관리자에만 의해 보고 있다. 그러나 콩몽이스 있지만브라우저에 구현 하는 경우, 브레키어 아마도 충족합니다 했다.

  • 2015년 update:* 내가 더 이상 사용하지 않고 브레키어 (it hasn& 업데이트되지 t # 39, 몇 년). # 39 m just I& 작은 경우, 내가 원하는 누구나 손쉽게 사용할 수 있으며, 오픈 소스 모듈에서는 먹어서나 어졌다면 I& # 39, ll 따라와야지 유사한 패턴으로 Caolan& # 39 의 응답 (위) - 내가 작성했습니까 [블로그 포스트] (http://csnw.github.io/2013/06/23/this-in-node-modules-and-iifes.html) 에 이 몇 년 전.

그러나 i& # 39 m 커뮤니티 콩몽이스 대한 개인적인 용도로 사용하는, 즉 표준화했습니다 먹어서나 모듈에서는 충족하거나 같이 [앰퍼샌드] (http://ampersandjs.com/) 커뮤니티) 그런 다음 그들을 i& # 39, ll 그냥 쓰기 콩몽이스 포맷하여 사용할 브라우세리피.

해설 (0)

노자이스 역시 가치가 이걸봐. 클라이언트 서버 및 클라이언트 서버 측 에서 에서 함수를 호출할 수 있습니다

해설 (3)

테스트 코드를 작성하는 것처럼 레키레이스 모듈을 사용하여 조종됩니다 이를 재스민 테스트.

이런 식으로 코드를 실행할 수 있는 모든 브라우저에서 재스민 html 로드되었는지 레키레이스 및 테스트를 할 수 있는 [재스민 노드입니다] 와 3 의 코드 또는 수정하십시오 node. js 필요 없이 테스트를 진행중이다.

이것은 작업 예 엔드입니다.

해설 (0)

[두아리피] 에서 브라우저를 쓸 스케쳐내 Node.js-like 스타일을 시도해 볼 수 있습니다 (https://github.com/farin/dualifyjs).

응용 프로그램을 작성할 수 있도록 제한 없이 코드 컴파일 있지만브라우저에 없다.

해설 (0)

览侩 荤례: share your app 구성 사이에 node. js 및 브라우저 (이건 그냥 그림을, 없는듯 최고의 외곽진입 따라 앱).

문제: 사용할 수 없습니다 '창' (node. js 없습니다) 와 '글로벌' (존재하지 않는 브라우저에서).

해결책:

  • 파일 config. js:

var 구성 = { foo. # 39, & # 39 bar&. }; if (= # 39, & # 39 메리 페로프 모듈에서는 object&;) 모두레드릭스포르츠 = 구성용.

  • 브라우저에서 (index. html):

,, src = &quot config.js&quot &gt &lt /script&gt 스크립트입니다 &lt. ,, src = &quot myApp.js&quot &gt &lt /script&gt 스크립트입니다 &lt.

이제 열어보려면 개발 도구 및 액세스하려면 전역 변수 '구성'

  • In node. js (아프자이스):

필요한 (# 39, & # 39, ./config&), const 구성 = 콘솔드로그 (콘피g. 포); # 39, & # 39 bar& // 보여준다.

  • 함께 바벨 또는 타입스크립트:

39, & # 39 에서 구성용 임포트합니다 ./config&;;

콘솔드로그 (콘피g. 포); # 39, & # 39 bar& // 보여준다.

해설 (3)

내가 작성했습니까 [간단한 모듈에서는] (https://gist.github.com/Gustavo6046/ba3e3a0a9fd493ebe382d0d887ed50a1), 가져올 수 있는 (사용하거나, 또는 스크립트에만 에 필요한 노드입니다 태그로 브라우저) 에서 모두 사용할 수 있는 로드하기에 모듈에서는 클라이언트와 서버의.

사용 예시

1. 정의중 모듈에서는

',' 파일 폴더 내의 파일을 에서 다음 배치하십시오 log2.js 정적 웹.

let exports = {};

exports.log2 = function(x) {
    if ( (typeof stdlib) !== 'undefined' )
        return stdlib.math.log(x) / stdlib.math.log(2);

    return Math.log(x) / Math.log(2);
};

return exports;

그렇게 단순!

2. 모듈을 사용하여

A 모듈에서는 불러올 수 있기 때문에 우리는 양자 로더입니다 양측에서 (클라이언트 및 서버). 따라서 다음과 같이 할 수 있습니다, 하지만 당신은 don& # 39, t need to do 둘을 동시에 (let alone 특정 순서로):

  • 의 노드입니다

39 에서 노드, it&; s 단순하다.

var loader = require('./mloader.js');
loader.setRoot('./web');

var logModule = loader.importModuleSync('log2.js');
console.log(logModule.log2(4));

'2' 반품해야 합니다.

39, s, t # 39 의 Node& isn& 파일의 경우 현재 디렉터리인 smartupdate 로드리스트로트 '란' 파일 폴더 경로를 통해 데이터베이스에구성원을 정적 웹 (또는 요건에 따라 어느 모듈은).

  • 브라우저에서:

첫째, 정의하십시오 웹 페이지:


    <header>
        <meta charset="utf-8" />
        Module Loader Availability Test

        <script src="mloader.js"></script>
    </header>


        <h1>Result</h1>
        <p id="result"><span style="color: #000088">Testing...</span></p>

        <script>
            let mod = loader.importModuleSync('./log2.js', 'log2');

            if ( mod.log2(8) === 3 && loader.importModuleSync('./log2.js', 'log2') === mod )
                document.getElementById('result').innerHTML = "Your browser supports bilateral modules!";

            else
                document.getElementById('result').innerHTML = "Your browser doesn't support bilateral modules.";
        </script>

T , # 39 smartupdate don& 브라우저에서 직접 파일을 열 수 있습니다. 내가 사용하기 때문에 afc 아약스, 파이썬 3& # 39 ',' s take a look at 너회가 제안하세요 하트피세르베르 모듈에서는 (또는, 웹 서버 구축 솔루션은 초고속 있는모든 너회의 명령줄이, 폴더) 를 사용할 수 있습니다.

이 경우, 모든 것이 잘 어울린다 나타납니다.

! [입력하십시오. 이미지 여기에 설명을] [1]

해설 (0)

나는 이 모든 변수를 설정할 경우, 작성했습니까 간단하게 사용할 수 있는 글로벌 범위:

(function(vars, global) {
    for (var i in vars) global[i] = vars[i];
})({
    abc: function() {
        ...
    },
    xyz: function() {
        ...
    }
}, typeof exports === "undefined" ? this : exports);
해설 (0)