Estou experimentando com ES6, e estou usando gole para construir e babel para transpilar para ES5. A saída não está sendo executada no nó, apenas vinculado a um arquivo .htm com uma tag. Estou pensando que preciso adicionar
<script src='require.js'></script>
ou algo assim.
Estou tentando 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;
}
}
Erro é
Uncaught ReferenceError: require is not defined
Refere-se a isto (após .pipe (babel ()) em gulp)
var _shapes = require('shapes');
javascript
ecmascript-6
Jason
fonte
fonte
require
não existe no navegador, você precisa usar alguma ferramenta de construção como Require.js, Browserify ou Webpack.require
função (novamente, nada a ver com require.js). No entanto, você pode dizer ao Babel para converter módulos para outra coisa , por exemplo, AMD ou UMD, que funcionaria com o require.js. De qualquer forma, você precisa de um sistema para carregar módulos no navegador, porque o navegador não fornece um por padrão (ainda).Respostas:
Você pode precisar de algum carregador de módulo, mas não é necessário RequireJS. Você tem várias opções. O que segue irá ajudá-lo a começar.
rollup.js com rollup-plugin-babel
Rollup é um empacotador de módulo JavaScript de próxima geração. Ele entende os módulos ES2015 nativamente e produzirá um pacote que não precisa de nenhum carregador de módulo para operar. As exportações não utilizadas serão cortadas da saída, é chamado de agitação de árvore.
Agora, eu pessoalmente recomendo usar rollupjs, pois produz a saída mais clara e é fácil de configurar, no entanto, oferece um aspecto diferente para a resposta. Todas as outras abordagens fazem o seguinte:
Com rollupjs as coisas realmente não funcionam assim. Aqui, o rollup é a primeira etapa, em vez de babel. Ele só entende módulos ES6 por padrão. Você deve fornecer um módulo de entrada do qual as dependências serão percorridas e concatenadas. Como o ES6 permite várias exportações nomeadas em um módulo, rollupjs é inteligente o suficiente para retirar as exportações não utilizadas, reduzindo assim o tamanho do pacote. Infelizmente, o analisador rollupjs-s não entende a sintaxe ES6, então os módulos ES7 devem ser compilados antes que o rollup os analise, mas a compilação não deve afetar as importações ES6. Isso é feito usando o
rollup-plugin-babel
plugin com obabel-preset-es2015-rollup
preset (este preset é igual ao es2015, exceto o transformador do módulo e o plugin de auxiliares externos). Portanto, o rollup fará o seguinte com seus módulos, se configurados corretamente:Exemplo de compilação de nodejs:
Exemplo de construção do grunt com grunt-rollup
Exemplo de gulp build com gulp-rollup
Babelify + Browserify
O Babel tem um pacote bacana chamado babelify . Seu uso é simples e direto:
ou você pode usá-lo em node.js:
Isso irá transpilar e concatenar seu código de uma vez. O Browserify
.bundle
incluirá um pequeno carregador CommonJS agradável e organizará seus módulos transpilados em funções. Você pode até ter importações relativas.Exemplo:
Para compilar, basta executar
node build.js
na raiz do projeto.Babel + WebPack
Compile todo o seu código usando o babel. Eu recomendo que você use o transformador do módulo amd (chamado
babel-plugin-transform-es2015-modules-amd
em babel 6). Depois disso, empacote suas fontes compiladas com WebPack.O WebPack 2 foi lançado! Ele compreende módulos ES6 nativos e executa (ou melhor, simula) a agitação da árvore usando a eliminação de código morto embutida do babili . Por enquanto (setembro de 2016), eu ainda sugiro usar o rollup com o babel, embora minha opinião possa mudar com o primeiro lançamento do WebPack 2. Sinta-se à vontade para discutir suas opiniões nos comentários.
Pipeline de compilação personalizado
Às vezes, você deseja ter mais controle sobre o processo de compilação. Você pode implementar seu próprio pipeline desta forma:
Primeiro, você deve configurar o babel para usar os módulos amd. Por padrão, o babel transpila para módulos CommonJS, o que é um pouco complicado de manipular no navegador, embora o browserify consiga lidar com eles de uma maneira agradável.
{ modules: 'amdStrict', ... }
opção de usoes2015-modules-amd
pluginNão se esqueça de ativar a
moduleIds: true
opção.Verifique o código transpilado para nomes de módulos gerados, muitas vezes há incompatibilidades entre os módulos definidos e necessários. Consulte sourceRoot e moduleRoot .
Finalmente, você deve ter algum tipo de carregador de módulo, mas não é necessário. Há almondjs , um pequeno calço que funciona bem. Você pode até implementar o seu próprio:
No final, você pode apenas concatenar o shim do carregador e os módulos compilados juntos e executar um uglify nisso.
O código padrão do Babel é duplicado em todos os módulos
Por padrão, a maioria dos métodos acima compila cada módulo com babel individualmente e, em seguida, concatena-os. É isso que o babelify também faz. Mas se você olhar o código compilado, verá que o babel insere vários clichês no início de cada arquivo, a maioria deles duplicados em todos os arquivos.
Para evitar isso, você pode usar o
babel-plugin-transform-runtime
plugin.fonte
barebones webpack 2
1) Se este for o seu diretório raiz:
index.html
scripts.js
shapes.js
2) ter o nó instalado no nó
3) execute o seguinte comando em seu terminal:
5) em seu diretório raiz, execute o seguinte:
Agora você deve ter um arquivo chamado bundle.js em seu diretório raiz, que será o arquivo que seu index.html consumirá. Este é um recurso de empacotamento minimalista do webpack. Você pode aprender mais aqui
fonte
require
não existe no navegador, portanto, esse erro é esperado. Você precisa usar algo como require.js ou Browserify.fonte