노드의 클라이언트 : Uncaught ReferenceError : require is not defined


320

그래서 node / express + jade 콤보로 응용 프로그램을 작성 중입니다.

나는이 client.js클라이언트에로드된다. 그 파일에는 다른 JavaScript 파일에서 함수를 호출하는 코드가 있습니다. 내 시도는 사용했다

var m = require('./messages');

messages.js서버 측에서와 마찬가지로 나중에 해당 파일에서 호출 함수 의 내용을로드하기 위해 . 그러나 require클라이언트 측에 정의되어 있지 않으며 형식 오류가 발생합니다 Uncaught ReferenceError: require is not defined.

이 다른 JS 파일은 웹 페이지의 헤더에 링크를 배치하기 때문에 클라이언트에서 런타임에로드됩니다. 따라서 클라이언트는 이러한 다른 파일에서 내 보낸 모든 기능을 알고 있습니다.

소켓을 서버에 여는 messages.js메인 client.js파일의 다른 JS 파일 (예 :)에서 이러한 함수를 어떻게 호출 합니까?


4
<script src="messages.js"></script>그 후에 그냥 전화해서 어때?
스털링 궁수

1
아마도 이것은 해결책이 될 수 있지만 나에게 또 다른 문제가 있습니다. 또한 클라이언트와 서버에 공통된 표현을 추상화하기 위해 "representation.js"라는 파일이 있습니다. 이 파일에는 require 문이 있으며 서버 측에서는 노드를 실행 중이므로 괜찮습니다. 그러나 클라이언트 측에서는 이것이 문제가 될 것입니다. 어떻게 생각해?
MightyMouse

2
저와 같은 초보자 (일주일 전에 "npm"철자를 쓰지 못했습니다! :-)의 경우 browserify의 --require옵션이 require()클라이언트 쪽에서 정의 된다는 것을 이해하는 것이 도움이 될 수 있습니다 . 참조 : lincolnloop.com/blog/speedy-browserifying-multiple-bundles
Hephaestus

2
@Sterling Archer ... 만약 100 개의 파일이 있다면 ... HTML로 계속 로딩 할 수 없습니다 .........
Baradwaj Aryasomayajula

답변:


436

require()브라우저 / 클라이언트 측 JavaScript에는 존재하지 않기 때문 입니다.

이제 클라이언트 측 JavaScript 스크립트 관리에 대해 몇 가지 선택을해야합니다.

세 가지 옵션이 있습니다.

  1. <script>태그를 사용하십시오 .
  2. CommonJS 구현을 사용하십시오 . Node.js와 같은 동기 종속성
  3. AMD 구현을 사용하십시오 .

CommonJS 클라이언트 측 구현에는 다음이 포함됩니다.

(대부분 배포하기 전에 빌드 단계가 필요합니다)

  1. Browserify- 브라우저에서 대부분의 Node.js 모듈을 사용할 수 있습니다. 이것은 내가 개인적으로 좋아하는 것입니다.
  2. 웹팩 -모든 작업을 수행합니다 (JS, CSS 등 번들). React.js의 급증으로 인기를 얻었습니다. 어려운 학습 곡선으로 유명합니다.
  3. 롤업 -새로운 경쟁자. ES6 모듈을 활용합니다. 트리 셰이 킹 기능을 포함합니다 (사용하지 않는 코드 제거).

Browserify vs (더 이상 사용되지 않는) Component 비교에 대한 자세한 내용을 읽을 수 있습니다 .

AMD 구현에는 다음이 포함됩니다.

  1. RequireJS- 클라이언트 측 JavaScript 개발자들에게 매우 인기가 있습니다. 비동기 특성으로 인해 내 취향이 아닙니다.

어떤 것을 고를 지에 대한 검색에서 Bower 에 대해 읽을 것 입니다. Bower는 패키지 종속성만을위한 것이며 CommonJS 및 AMD와 같은 모듈 정의에는 영향을주지 않습니다.

이것이 도움이되기를 바랍니다.


1
대단히 감사합니다. 나는 미니 테스트를 별도로 만들었습니다. 그래서 응답하는 데 시간이 걸렸습니다. 이 마법이 어떻게 작동했는지 이해하기 위해 몇 분 안에 몇 가지 질문이 다시 올 수 있습니다. 나는 모든 것을 하나로 묶고 싶다. 다시 감사합니다. Browserify는 흔들리는 것 같습니다! :)
MightyMouse

6
JSPM이 목록에 추가되어야한다고 생각합니다.
Martijn

19
<script>nodeJs 패키지 관리자를 사용하지 않고 태그를 사용하여 React 클래스를 가져 오는 예제를 얻을 수 있습니까?
Louie Bertoncin

2
SystemJS와 JSPM은 매우 중요한 누락입니다.
Aluan Haddad

4
네. 컴포넌트는 이제 더 이상 사용되지 않습니다. github.com/componentjs/component
i_emmanuel

43

전자 환경에서 렌더러 프로세스와 기본 프로세스 간의 IPC 통신이 필요합니다. 렌더러 프로세스는 스크립트 태그 사이의 HTML 파일에 있으며 동일한 오류를 생성합니다. 라인

const {ipcRenderer} = require('electron')

가 발생합니다 catch되지 않은 오류 ReferenceError를 : 정의되지 않은 필요

브라우저 창 (이 HTML 파일이 포함 된 곳)이 기본 프로세스에서 처음 만들어 졌을 때 노드 통합을 true로 지정하여이 문제를 해결할 수있었습니다.

function createAddItemWindow() {
//Create new window
addItemWindown = new BrowserWindow({
    width: 300,
    height: 200,
    title: 'Add Item',

    //The lines below solved the issue
    webPreferences: {
        nodeIntegration: true
    }
})}

그것은 나를 위해 문제를 해결했습니다. 해결책은 여기 에 제안 되었습니다 . 이것이 다른 누군가를 돕기를 바랍니다. 건배.


대단히 감사합니다. YouTube의 동일한 쇼핑 목록 앱 비디오에서 온 것 같습니다
Luiscri

Brilliant-초보자를 의지하여 마술처럼 모든 것을 하나로 모으는 대신 이와 같은 답변을 찾는 것이 좋습니다.
GhostBytes 2018 년

Electron 사용자에게 탁월한 답변!
thoni56

놀랄 만한. 나에게 꽤 잘 작동합니다. 또한, 나는 쇼핑 목록 앱 비디오에서 온다 o /
adahox_

26

ES6 : HTML에서 속성을 사용하여 기본 js 파일 포함 type="module"( 브라우저 지원 ) :

<script type="module" src="script.js"></script>

그리고 script.js파일에 다음과 같은 다른 파일을 포함하십시오.

import { hello } from './module.js';
...
// alert(hello());

포함 된 파일 ( module.js) 안에는 가져올 함수 / 클래스 보내야합니다.

export function hello() {
    return "Hello World";
}

실제 사례는 여기 .


1
@Curse 여기서 stackoverflow.com/a/44591205/860099 는 "모듈은 이름 충돌을 피하기 위해 범위를 만듭니다."라고 쓰여 있습니다. 당신은 "수동으로" val창 개체에 넣을 수 있습니다 window.val = val. 여기 plunker은 다음과 같습니다 Plunker : plnkr.co/edit/aDyjyMxO1PdNaFh7ctBT?p=preview -이 솔루션 작품
카밀 Kiełczewski

1

내 경우에는 다른 솔루션을 사용했습니다.

프로젝트에는 CommonJ가 필요하지 않으며 ES3 호환성 (모듈이 지원되지 않음)이 있어야 하므로 tsconfig 에는 포함되어 있지 않기 때문에 코드에서 모든 exportimport 문만 제거하면됩니다.

"module": "commonjs"

그러나 참조 파일에서 import 및 export 문을 사용하십시오.

import { Utils } from "./utils"
export interface Actions {}

최종 생성 된 코드는 항상 (적어도 typescript 3.0의 경우) 그러한 행을 갖습니다.

"use strict";
exports.__esModule = true;
var utils_1 = require("./utils");
....
utils_1.Utils.doSomething();

1

이 기능을 사용해도 작동하지 않습니다. 가장 좋은 해결책은 browserify입니다.

module.exports = {
  func1: function () {
   console.log("I am function 1");
  },
  func2: function () {
    console.log("I am function 2");
  }
};

-getFunc1.js-
var common = require('./common');
common.func1();

0

이것은 나를 위해 일했다

  1. 이 파일을 저장하십시오 https://requirejs.org/docs/release/2.3.5/minified/require.js

  2. <script data-main="your-Scrpt.js" src="require.js"></script>
    노트 와 같이 HTML에로드 하십시오!
    사용 : "your-script.js"에서-> require ([ 'moudle-name'])
    필요하지 않습니다 ( 'moudle-name')
    const {ipcRenderer} = require ([ 'electron'])
    아님 : const {ipcRenderer} = require ( '전자')

3
절대로 "여기를 클릭하십시오"를 권장하지 마십시오. 가장 좋은 경우는 RickRoll이지만 해당 링크의 끝에서 무엇을 기다리고 있는지 전혀 모릅니다.
ggdx
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.