Estoy experimentando con ES6, y estoy usando gulp para construir y babel para transpilar a ES5. La salida no se ejecuta en el nodo, solo se vincula desde un archivo .htm con una etiqueta. Estoy pensando que necesito agregar
<script src='require.js'></script>
o algo así.
Estoy intentando importar / exportar.
////////////////scripts.js
import {Circle} from 'shapes';
c = new Circle(4);
console.log(c.area());
/////////////////shapes.js
export class Circle {
circle(radius) {
this.radius = radius;
}
area() {
return this.radius * this.radius * Math.PI;
}
}
El error es
Uncaught ReferenceError: require is not defined
Se refiere a esto (después de .pipe (babel ()) en gulp)
var _shapes = require('shapes');
javascript
ecmascript-6
jason
fuente
fuente
require
que no existe en el navegador, debe utilizar alguna herramienta de compilación como Require.js, Browserify o Webpack.require
función (de nuevo, nada que ver con require.js). Sin embargo, puede decirle a Babel que convierta los módulos en otra cosa , por ejemplo, AMD o UMD, que luego funcionaría con require.js. De cualquier manera, necesita un sistema para cargar módulos en el navegador, porque el navegador no proporciona uno por defecto (todavía).Respuestas:
Puede que necesite algún cargador de módulos, pero no es necesario RequireJS. Tienes varias opciones. Lo siguiente le ayudará a comenzar.
rollup.js con rollup-plugin-babel
Rollup es un paquete de módulos JavaScript de próxima generación. Entiende los módulos ES2015 de forma nativa y producirá un paquete que no necesita ningún cargador de módulos para funcionar. Las exportaciones no utilizadas se recortarán de la salida, se llama agitación de árboles.
Ahora personalmente recomiendo usar rollupjs, ya que produce la salida más clara y es fácil de configurar, sin embargo, le da un aspecto diferente a la respuesta. Todos los demás enfoques hacen lo siguiente:
Con rollupjs, las cosas realmente no funcionan de esta manera. Aquí, el rollup es el primer paso, en lugar de babel. Solo comprende los módulos ES6 por defecto. Debe proporcionar un módulo de entrada del cual se atravesarán y concatenarán las dependencias. Como ES6 permite múltiples exportaciones con nombre en un módulo, rollupjs es lo suficientemente inteligente como para eliminar las exportaciones no utilizadas, reduciendo así el tamaño del paquete. Desafortunadamente, el analizador rollupjs-s no comprende la sintaxis de ES6, por lo que los módulos de ES7 deben compilarse antes de que el rollup los analice, pero la compilación no debería afectar las importaciones de ES6. Se hace usando el
rollup-plugin-babel
complemento con elbabel-preset-es2015-rollup
preset (este preset es el mismo que el es2015, excepto el módulo transformer y el plugin external-helpers). Así que el rollup hará lo siguiente con sus módulos si está configurado correctamente:Ejemplo de compilación de nodejs:
Ejemplo de construcción de grunt con grunt-rollup
Ejemplo de compilación de gulp con gulp-rollup
Babelify + Browserify
Babel tiene un paquete ordenado llamado babelify . Su uso es simple y directo:
o puede usarlo desde node.js:
Esto transpilará y concatenará su código a la vez. Browserify's
.bundle
incluirá un pequeño cargador CommonJS y organizará sus módulos transpilados en funciones. Incluso puede tener importaciones relativas.Ejemplo:
Para compilar, simplemente ejecute
node build.js
en la raíz de su proyecto.Babel + WebPack
Compila todo tu código usando babel. Te recomiendo que uses el transformador de módulo amd (llamado
babel-plugin-transform-es2015-modules-amd
en babel 6). Después de eso, combine sus fuentes compiladas con WebPack.¡WebPack 2 ya está disponible! Entiende los módulos nativos de ES6 y realizará (o más bien simulará) la agitación de árboles utilizando la eliminación de código muerto incorporada de babili -s. Por ahora (septiembre de 2016), todavía sugeriría usar rollup con babel, aunque mi opinión podría cambiar con la primera versión de WebPack 2. No dude en comentar sus opiniones en los comentarios.
Canalización de compilación personalizada
A veces, desea tener más control sobre el proceso de compilación. Puede implementar su propia canalización de esta manera:
Primero, debe configurar babel para usar módulos amd. De forma predeterminada, babel se transpila a módulos CommonJS, lo cual es un poco complicado de manejar en el navegador, aunque browserify se las arregla para manejarlos de una manera agradable.
{ modules: 'amdStrict', ... }
opción de usoes2015-modules-amd
complementoNo olvide activar la
moduleIds: true
opción.Compruebe el código transpilado para ver los nombres de los módulos generados, a menudo hay discrepancias entre los módulos definidos y requeridos. Consulte sourceRoot y moduleRoot .
Finalmente, debe tener algún tipo de cargador de módulos, pero no es necesario requirejs. Hay almondjs , una pequeña calza que funciona bien. Incluso puedes implementar el tuyo propio:
Al final, puede concatenar el calce del cargador y los módulos compilados juntos, y ejecutar un uglify en eso.
El código repetitivo de Babel está duplicado en cada módulo
De forma predeterminada, la mayoría de los métodos anteriores compilan cada módulo con babel individualmente y luego los concatenan juntos. Eso es lo que hace también babelify. Pero si observa el código compilado, verá que babel inserta una gran cantidad de texto estándar al principio de cada archivo, la mayoría de ellos están duplicados en todos los archivos.
Para evitar esto, puede utilizar el
babel-plugin-transform-runtime
complemento.fuente
paquete web barebones 2
1) Si este es su directorio raíz:
index.html
scripts.js
shape.js
2) se han instalado nodo nodo
3) ejecuta el siguiente comando en tu terminal:
5) en su directorio raíz ejecute lo siguiente:
Ahora debería tener un archivo llamado bundle.js en su directorio raíz, que será el archivo que consumirá su index.html. Esta es una característica de agrupación minimalista de webpack. Puedes aprender más aquí
fuente
require
no existe en el navegador, por lo que se espera este error. Necesita usar algo como require.js o Browserify.fuente