Düğümdeki istemci: Yakalanmayan ReferenceError: gereksinim tanımlanmadı


321

Bu yüzden node / express + jade combo ile bir uygulama yazıyorum.

Ben client.jsistemci üzerinde yüklü olan,. Bu dosyada diğer JavaScript dosyalarından işlevleri çağıran kod var. Benim girişimim

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

messages.js(sunucu tarafında yaptığım gibi) ve daha sonra bu dosyadan çağrı işlevlerinin içeriğini yüklemek için . Ancak, requireistemci tarafında tanımlanmaz ve formda bir hata atar Uncaught ReferenceError: require is not defined.

Bağlantıları web sayfasının başlığına yerleştirdiğim için bu diğer JS dosyaları da istemcide çalışma zamanında yüklenir. Böylece istemci bu diğer dosyalardan dışa aktarılan tüm fonksiyonları bilir.

Soketi sunucuya açan messages.jsana client.jsdosyadaki bu diğer JS dosyalarından (örneğin ) bu işlevleri nasıl çağırırım ?


4
Neden sadece <script src="messages.js"></script>bundan sonra onları aramıyorsun?
Sterling Archer

1
Belki bu bir çözüm olabilir, ama beni ilgilendiren başka bir şey daha var. Ayrıca istemci ve sunucu için ortak temsil soyutlama için "Representation.js" adlı bir dosya var. Bu dosyada ben de ifadeler gerektirir ve düğüm çalıştırıyorum çünkü sunucu tarafında Tamam olmalıdır. Ancak, istemci tarafında bu bir sorun olacaktır. Ne düşünüyorsun?
MightyMouse

2
Benim gibi yeni başlayanlar için (bir hafta önce "npm" bile heceleyemeyen! :-), browserify --requireseçeneğinin require()istemci tarafında tanımlanmasına neden olduğunu anlamak yararlı olabilir . Bakınız: lincolnloop.com/blog/speedy-browserifying-multiple-bundles
Hephaestus

2
@Sterling Archer ... Bu tür 100 dosya varsa ... HTML'ye doğru yüklemeye devam
edemeyiz

Yanıtlar:


436

Bunun nedeni require(), tarayıcı / istemci tarafı JavaScript'te bulunmamasıdır.

Şimdi, istemci tarafı JavaScript komut dosyası yönetiminiz hakkında bazı seçimler yapmanız gerekecek.

Üç seçeneğiniz var:

  1. <script>Etiketi kullan .
  2. Bir CommonJS uygulaması kullanın . Node.js gibi senkron bağımlılıklar
  3. Bir AMD uygulaması kullanın .

CommonJS istemci yan uygulamaları şunları içerir:

(çoğu konuşlandırmadan önce bir oluşturma adımı gerektirir)

  1. Browserify - Tarayıcıda çoğu Node.js modülünü kullanabilirsiniz. Bu benim kişisel favorim.
  2. Webpack - Her şeyi yapar (JS, CSS vb. Paketleri). React.js dalgalanması ile popüler hale getirildi. Zor öğrenme eğrisi ile tanınıyor.
  3. Toplama - Yeni rakip. ES6 modüllerinden yararlanır. Ağaç sallama yeteneklerini içerir (kullanılmayan kodu kaldırır).

Browserify vs (kullanımdan kaldırıldı) Bileşeni karşılaştırmam hakkında daha fazla bilgi edinebilirsiniz .

AMD uygulamaları şunları içerir:

  1. RequireJS - İstemci tarafı JavaScript geliştiricileri arasında çok popüler. Eşzamansız doğası nedeniyle benim zevkim değil.

Hangisiyle gideceğinizi seçtiğinizde Bower hakkında bilgi edineceksiniz . Bower yalnızca paket bağımlılıkları içindir ve CommonJS ve AMD gibi modül tanımlarında açık değildir.

Umarım bu biraz yardımcı olur.


1
Çok teşekkür ederim. Ayrı bir mini test yaptım, bu yüzden cevap vermem biraz zaman aldı. Bu büyünün nasıl çalıştığını anladığımdan emin olmak için birkaç dakika içinde birkaç soru ile geri dönebilirim. Sadece her şeyi bir araya getirmek istiyorum. Tekrar teşekkürler. Browserify sallanıyor gibi görünüyor! :)
MightyMouse

6
Bence JSPM listeye eklenmeli.
Martijn

19
<script>Bir nodeJs paket yöneticisi kullanmadan bir React sınıfını içe aktarmak için etiketi kullanma örneğini alabilir miyim ?
Louie Bertoncin

2
SystemJS ve JSPM çok dikkate değer eksikliklerdir.
Aluan Haddad

4
Evet. Bileşen şimdi kullanımdan kaldırıldı github.com/componentjs/component
i_emmanuel

43

Oluşturucu süreci ile ana süreç arasında IPC iletişimine ihtiyaç duyduğum bir elektron ortamından geliyorum. Oluşturucu işlemi, komut dosyası etiketleri arasındaki bir HTML dosyasında oturur ve aynı hatayı oluşturur. Çizgi

const {ipcRenderer} = require('electron')

Yakalanmamış ReferenceError değerini atar : requir tanımlanmamış

Tarayıcı penceresinin (bu HTML dosyasının gömülü olduğu yerde) başlangıçta ana süreçte oluşturulduğu zaman düğüm entegrasyonunu doğru olarak belirleyerek bu sorunu çözebildim.

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

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

Bu benim için sorunu çözdü. Çözüm burada önerildi . Umarım bu başka birine yardımcı olur. Şerefe.


Çok teşekkür ederim. Sanırım YouTube'dan aynı Alışveriş Listesi uygulama videosundan
geliyorum

Parlak - sizin için sihirli bir şekilde bir araya getirmek için yeni başlayanlara güvenmek yerine böyle cevaplar bulmak güzel.
GhostBytes

Elektron kullanıcıları için mükemmel cevap!
thoni56

inanılmaz. benim için gayet iyi çalışıyor. Ayrıca, ben de Alışveriş Listesi app video geliyor o /
adahox_

26

ES6: Html'ye özniteliği kullanan ana js dosyasını dahil et type="module"( tarayıcı desteği ):

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

Ve script.jsdosyaya bunun gibi başka bir dosya ekleyin:

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

Dahil edilen file ( module.js) içinde içe aktaracağınız işlevi / sınıfı dışa aktarmanız gerekir

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

Burada çalışma örneği .


1
@Curse Burada stackoverflow.com/a/44591205/860099 yazılmıştır "Modül, ad çakışmalarını önlemek için bir kapsam oluşturur." sou "el ile" valpencere nesnesine koyabilirsiniz window.val = val. İşte dalgıç: Plunker: plnkr.co/edit/aDyjyMxO1PdNaFh7ctBT?p=preview - bu çözüm işe yarıyor
Kamil Kiełczewski

1

Benim durumumda başka bir çözüm kullandım.

Proje CommonJ'leri gerektirmediğinden ve ES3 uyumluluğuna (modüller desteklenmiyor) sahip olması gerektiğinden, tek yapmanız gereken kodunuzdaki tüm dışa aktarma ve içe aktarma ifadelerini kaldırmaktır , çünkü tsconfig'iniz içermiyor

"module": "commonjs"

Ancak referans dosyalarınızda içe ve dışa aktarma ifadeleri kullanın

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

Nihai oluşturulan kod her zaman bu tür satırlara sahip olacaktır (en azından daktilo 3.0 için)

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

1

Bunu kullanmak bile işe yaramaz, en iyi çözüm browserify olduğunu düşünüyorum:

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

Bu Benim İçin Çalıştı

  1. bu dosyayı kaydet https://requirejs.org/docs/release/2.3.5/minified/require.js
  2. HTML'nize bu
    <script data-main="your-Scrpt.js" src="require.js"></script>
    Not gibi yükleyin !
    kullanın: -> "your-script.js" dosyasında (['moudle-name']) gerektirir (['moudle-name'])
    gerekli değil ('moudle-name')
    const {ipcRenderer} = gerektirir (['elektron'])
    Not: const {ipcRenderer} = gerektirir ('elektron')

3
Asla, asla bir "buraya tıklayın" tavsiye, hiç. En iyi durumda, bu bir RickRoll, ama bu bağlantının sonunda bizi neyin beklediğine dair hiçbir fikrimiz yok.
ggdx
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.