MightyMouse
tengo archivo client.js
, que se carga en el cliente. En ese archivo tengo un código que llama a funciones de otros archivos JavaScript. Mi intento fue usar
var m = require('./messages');
para cargar el contenido de messages.js
(al igual que lo hago en el lado del servidor) y luego llamar a funciones desde ese archivo. Sin embargo, require
no está definido en el lado del cliente, y arroja un error de la forma Uncaught ReferenceError: require is not defined
.
Estos otros archivos JavaScript también se cargan en tiempo de ejecución en el cliente, porque coloco los enlaces en el encabezado de la página web. Entonces el cliente conoce todas las funciones que se exportan desde estos otros archivos.
¿Cómo llamo a estas funciones desde estos otros archivos JavaScript (como messages.js
) en general client.js
archivo que abre el socket al servidor?
J.P.Richardson
Esto es porque require()
no existe en el navegador/JavaScript del lado del cliente.
Ahora tendrá que tomar algunas decisiones sobre la administración de secuencias de comandos de JavaScript del lado del cliente.
Tienes tres opciones:
- Utilizar el
<script>
etiqueta. - Usar una ComúnJS implementación. Tiene dependencias síncronas como Node.js
- Usa un definición de módulo asíncrono (AMD) implementación.
ComúnJS Las implementaciones del lado del cliente incluyen (la mayoría de ellas requieren un paso de compilación antes de implementar):
- Navegador – Puede usar la mayoría de los módulos de Node.js en el navegador. Este es mi favorito personal.
- paquete web – Hace todo (agrupa código JavaScript, CSS, etc.). Se hizo popular por el surgimiento de React, pero es conocido por su difícil curva de aprendizaje.
- Enrollar – un nuevo contendiente. Aprovecha los módulos ES6 e incluye habilidades de sacudir árboles (elimina el código no utilizado).
Puedes leer más sobre mi comparación de Componente Browserify vs (obsoleto).
AMD implementaciones incluyen:
- RequerirJS – Muy popular entre los desarrolladores de JavaScript del lado del cliente. No es de mi gusto por su carácter asincrónico.
Tenga en cuenta que en su búsqueda para elegir cuál elegir, leerá sobre Cenador. Bower es solo para dependencias de paquetes y no tiene opiniones sobre definiciones de módulos como CommonJS y AMD.
-
Creo que JSPM debería agregarse a la lista.
– Martijn
11 de febrero de 2016 a las 9:12
-
¿Podría obtener un ejemplo del uso de la
<script>
etiqueta para importar una clase React sin el uso de un administrador de paquetes nodeJs?– Louie Bertoncin
12 mayo 2016 a las 16:50
-
¿Alguien sabe cómo usar require en el lado del cliente con webpack? Sigo recibiendo “requerir no está definido el error”
– usuario3226932
30 mayo 2016 a las 21:31
-
Sí. El componente ahora está en desuso github.com/componentjs/componente
– i_emmanuel
17 de julio de 2017 a las 12:35
-
¿Cómo puedo hacerlo usando la etiqueta
– FLAK-ZOSO
10 oct 2021 a las 7:20
kibonge murphy
vengo de un Electrón entorno, donde necesito CIP comunicación entre un proceso renderizador y el proceso principal. El proceso del renderizador se encuentra en un archivo HTML entre etiquetas de secuencias de comandos y genera el mismo error.
La línea
const {ipcRenderer} = require('electron')
lanza el Error de referencia no capturado: el requerimiento no está definido
Pude solucionarlo especificando la integración de Node.js como verdadera cuando la ventana del navegador (donde está incrustado este archivo HTML) se creó originalmente en el proceso principal.
function createAddItemWindow() {
// Create a new window
addItemWindown = new BrowserWindow({
width: 300,
height: 200,
title: 'Add Item',
// The lines below solved the issue
webPreferences: {
nodeIntegration: true,
contextIsolation: false
}
})}
Eso resolvió el problema para mí. La solución fue propuesta aquí.
-
¿Es segura esta solución? Escuché que no debería establecer nodeIntegration en verdadero, ¿es así? Soy un novato de Electron, así que esta es una pregunta genuina.
–Mike Baxter
23 de marzo de 2021 a las 23:46
-
Bueno, depende de cómo vayas a usar tu aplicación de electrones. El hilo de comentarios de la pregunta original de StackOverflow a la que hice referencia ofrece una breve descripción general de los aspectos de seguridad al hacer esto. Puedes seguir el hilo aquí. Pero en resumen: si esto se establece en verdadero, su aplicación tiene acceso al tiempo de ejecución del nodo, y si está ejecutando código remoto potencialmente malicioso, es solo una receta para el desastre.
– Kibonge Murphy
25 de marzo de 2021 a las 6:22
-
This won't work if you don't use Electron. If you don't use Electron, the above code will fail with "Unexpected token '}'".
– Alguien_que_se_opone_SE
5 de mayo de 2021 a las 5:23
-
Esto no se considera seguro y ahora es una práctica desaconsejada.
– Cirilo Gupta
11 de noviembre de 2021 a las 7:15
-
@Kibonge Murphy ¿Significa esto que todos los módulos de Nodo que realmente serían útiles en Electron están fuera de los límites? Como fs?
– Código de cabecera
26 de enero de 2022 a las 1:21
Kamil Kielczewski
ES6: En HTML, incluya el archivo JavaScript principal usando el atributo type="module"
(compatibilidad con navegador):
<script type="module" src="script.js"></script>
Y en el script.js
archivo, incluya otro archivo como este:
import { hello } from './module.js';
...
// alert(hello());
Dentro del archivo incluido (module.js
), usted debe exportar la función/clase que vas a importar:
export function hello() {
return "Hello World";
}
un trabajo ejemplo está aquí. Más información es aquí.
-
@Curse Here stackoverflow.com/a/44591205/860099 está escrito "El módulo crea un alcance para evitar colisiones de nombres". así que puedes poner "manualmente"
val
al objeto de la ventanawindow.val = val
. Aquí está Plunker: Plunker: plnkr.co/edit/aDyjyMxO1PdNaFh7ctBT?p=vista previa - esta solución funciona– Kamil Kielczewski
7 ago 2018 a las 14:20
-
¿De qué script.js estás hablando? No pude conseguir eso.. ¿Puedes decirme por favor?
– Mrinal Anand
2 de octubre de 2021 a las 6:53
-
@MrinalAnand su único nombre de ejemplo para archivo con código js
– Kamil Kielczewski
2 de octubre de 2021 a las 8:56
Noha Abuaesh
Reemplaza todo require
declaraciones con import
declaraciones. Ejemplo:
// Before:
const Web3 = require('web3');
// After:
import Web3 from 'web3';
Funcionó para mí.
ydanila
En mi caso utilicé otra solución.
Como el proyecto no requiere CommonJS y debe tener compatibilidad con ES3 (los módulos no son compatibles), todo lo que necesita es solo eliminar todo exportar y importar declaraciones de su códigoporque su tsconfig no contiene
"module": "commonjs"
Pero use declaraciones de importación y exportación en sus archivos de referencia
import { Utils } from "./utils"
export interface Actions {}
El código generado final siempre tendrá (al menos para TypeScript 3.0) tales líneas
"use strict";
exports.__esModule = true;
var utils_1 = require("./utils");
....
utils_1.Utils.doSomething();
-
¿De verdad te refieres a ES3? ES3 es 21 años, desde diciembre de 1999.
-Peter Mortensen
29 de diciembre de 2020 a las 22:56
-
Algunos televisores inteligentes antiguos no son totalmente compatibles con es5. Entonces solo es3 funciona en todas partes.
– ydanila
29 de diciembre de 2020 a las 23:21
Potherca
esto funcionó para mí
- Obtenga la última versión de la Página de descarga de RequireJS
Es el archivo para RequestJS que es lo que usaremos.
- Cárguelo en su contenido HTML de esta manera:
<script data-main="your-script.js" src="require.js"></script>
¡Notas!
Usar require(['moudle-name'])
en your-script.js
no require('moudle-name')
Usar const {ipcRenderer} = require(['electron'])
no const {ipcRenderer} = require('electron')
-
¿De verdad te refieres a ES3? ES3 es 21 años, desde diciembre de 1999.
-Peter Mortensen
29 de diciembre de 2020 a las 22:56
-
Algunos televisores inteligentes antiguos no son totalmente compatibles con es5. Entonces solo es3 funciona en todas partes.
– ydanila
29 de diciembre de 2020 a las 23:21
Pedro Mortensen
Incluso usando esto no funcionará. Creo que la mejor solución es Navegador:
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();
¿Por qué no simplemente
<script src="messages.js"></script>
y llamarlos después de eso?– Arquero esterlina
27/09/2013 a las 20:34
Quizás esto pueda ser una solución, pero hay otra cosa que me preocupa. También tengo un archivo llamado “representation.js” para abstraer la representación que es común al cliente y al servidor. En ese archivo también tengo instrucciones requeridas y en el lado del servidor debería estar bien porque estoy ejecutando node. Sin embargo, en el lado del cliente esto será un problema. ¿Qué opinas?
– MightyMouse
27/09/2013 a las 20:45
Para los novatos como yo (¡que ni siquiera podía deletrear “npm” hace una semana! :-), puede ser útil comprender que browserify’s
--require
Causas de la opciónrequire()
a definir en el lado del cliente. Ver: lincolnloop.com/blog/speedy-browserifying-multiple-bundles– Hefesto
12/03/2016 a las 18:34
@Sterling Archer… Si hay 100 archivos de este tipo… no podemos seguir cargando, en HTML, ¿verdad?………
– Baradwaj Aryasomayajula
9 de junio de 2016 a las 18:58
“cliente en node.js” es un título confuso porque “cliente” generalmente se refiere al cliente del navegador web, mientras que node.js es un entorno del lado del servidor. ¿Podemos aclarar si se trata de un navegador o de un nodo?
– ggorlen–sobre la huelga LLM
21 de septiembre de 2022 a las 15:17