ノード上のクライアント:キャッチされていないReferenceError:requireが定義されていません


322

したがって、私はnode / express + jadeコンボを使用したアプリケーションを作成しています。

私が持っているclient.jsクライアントにロードされています、。そのファイルには、他のJavaScriptファイルから関数を呼び出すコードがあります。私の試みは使用することでした

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

messages.js(サーバー側で行うのと同じように)のコンテンツをロードし、後でそのファイルから関数を呼び出します。ただし、requireクライアント側では定義されておらず、フォームのエラーをスローしますUncaught ReferenceError: require is not defined

これらの他のJSファイルも、リンクをWebページのヘッダーに配置するため、ランタイムでクライアントに読み込まれます。したがって、クライアントはこれらの他のファイルからエクスポートされるすべての関数を知っています。

サーバーへのソケットを開くmessages.jsメインclient.jsファイル内の他のJSファイル(など)からこれらの関数を呼び出すにはどうすればよいですか?


4
ただ<script src="messages.js"></script>電話をかけたらどうですか?
スターリングアーチャー

1
おそらくこれが解決策になる可能性がありますが、私にはもう1つ問題があります。また、クライアントとサーバーに共通の表現を抽象化するための「representation.js」というファイルもあります。そのファイルにはrequireステートメントもあり、サーバー側ではノードを実行しているので問題ありません。ただし、クライアント側ではこれが問題になります。どう思いますか?
MightyMouse 2013

2
私のような初心者(1週間前に "npm"を入力することさえできなかった!:-)の--require場合、browserifyのオプションがrequire()クライアント側で定義される原因となることを理解しておくと役立ちます。参照:lincolnloop.com/blog/speedy-browserifying-multiple-bundles
Hephaestus

2
@Sterling Archer ...そのようなファイルが100個ある場合... HTMLでの読み込みを続けることができません......
Baradwaj Aryasomayajula

回答:


436

これは、require()がブラウザ/クライアント側のJavaScriptに存在しないためです。

次に、クライアント側のJavaScriptスクリプト管理についていくつかの選択を行う必要があります。

次の3つのオプションがあります。

  1. <script>タグを使用します。
  2. CommonJS実装を使用します。Node.jsのような同期依存関係
  3. AMD実装を使用します。

CommonJSクライアント側の実装には次のものがあります。

(それらのほとんどは、デプロイする前にビルド手順が必要です)

  1. Browserify-ほとんどのNode.jsモジュールをブラウザーで使用できます。これは私の個人的なお気に入りです。
  2. Webpack-すべてを実行します(JS、CSSなどをバンドル)。React.jsの急増により人気を博しました。難しい学習曲線で有名です。
  3. ロールアップ -新しい候補。ES6モジュールを活用します。ツリーを揺さぶる機能が含まれています(未使用のコードを削除します)。

Browserifyと(非推奨)コンポーネントの比較については、こちらをご覧ください

AMDの実装には次のものがあります。

  1. RequireJS-クライアント側のJavaScript開発者の間で非常に人気があります。その非同期の性質のため、私の好みではありません。

どちらを使用するかを選択する検索では、Bowerについて読むことに注意してください。Bowerはパッケージの依存関係のみを対象としており、CommonJSやAMDのようなモジュール定義には当てはまりません。

これが一部に役立つことを願っています。


1
どうもありがとうございました。別途ミニテストを行ったので、返答に時間がかかった。この魔法がどのように機能したかを理解していることを確認するためだけに、数分でいくつかの質問に戻るかもしれません。私はすべてを組み合わせたいだけです。再度、感謝します。Browserifyはロックしているようです!:)
MightyMouse 2013

6
JSPMをリストに追加する必要があると思います。
Martijn 2016

19
<script>タグを使用して、nodeJsパッケージマネージャーを使用せずにReactクラスをインポートする例を入手できますか?
Louie Bertoncin 2016年

2
SystemJSとJSPMは非常に重要な省略です。
Aluan Haddad

4
うん。コンポーネントは非推奨になりましたgithub.com/componentjs/component
i_emmanuel 2017

43

私はレンダラープロセスとメインプロセス間のIPC通信が必要な電子環境から来ています。レンダラープロセスは、スクリプトタグの間のHTMLファイルにあり、同じエラーを生成します。この線

const {ipcRenderer} = require('electron')

Uncaught ReferenceErrorをスローします:requireが定義されていません

ブラウザウィンドウ(この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からの同じショッピングリストアプリのビデオから来たと思いますhahaha
Luiscri

ブリリアント-初心者に頼ってすべてを魔法のようにまとめるのではなく、このような答えを見つけるのはいいことです。
GhostBytes

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 は「モジュールは名前の衝突を避けるためにスコープを作成します」と書かれています。souあなたは「手動で」valwindowオブジェクトに置くことができ ますwindow.val = val。ここにplunkerがあります:Plunker:plnkr.co/edit/aDyjyMxO1PdNaFh7ctBT?p = preview-このソリューションは機能します
KamilKiełczewski18年

1

私の場合、別のソリューションを使用しました。

プロジェクトはCommonJsを必要とせず、ES3互換性(モジュールはサポートされていません)を備えている必要があるため、tsconfigにコードが含まれていないため、コードからすべてのエクスポートおよびインポートステートメントを削除するだけです。

"module": "commonjs"

ただし、参照ファイルでインポートおよびエクスポートステートメントを使用する

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. このようにHTMLにロードします
    <script data-main="your-Scrpt.js" src="require.js"></script>

    使用:-> require(['moudle-name'])in "your-script.js"
    必要ありません( 'moudle-name')
    const {ipcRenderer} = require(['electron'])
    Not:const {ipcRenderer} = require( 'electron')

3
「ここをクリック」をお勧めしません。最良の場合、それはRickRollですが、そのリンクの終わりに何が待ち受けているのかはまったくわかりません。
ggdx
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.