Solucionado (ver solução)
Solucionado
(ver solução)
11
respostas

Para quem está se aventurando no webpack 4: 'split-chunks-plugin'

Bem... Ao utilizar o webpack 4 no meu projeto, me deparei com a seguinte mensagem: "Desde o webpack v4, o CommonsChunkPlugin foi removido em favor de optimization.splitChunks". Visto isto, já se sabe né: "Puts! Tudo o que o professor está fazendo passo a passo na video aula não será como esperado... =/". Enfim, sou um pouco lento para entender as coisas, todavia quero compartilhar com os que passam pelo mesmo aperreio que eu, como FICOU meu arquivo final utilizando agora o SPLIT-CHUNKS-PLUGIN no projeto... O resultado final, será 2 bundles na pasta dist (Um contendo somente o js do projeto e o outro contendo o js referente ao botstrap-jquery-reflect).... Diferentemente da video-aula, continuamos aqui tendo apenas um entry! as libs q quero separar em um novo bundle ficará contido na propriedade test. Atentem-se ao comentário no codigo p/ + infos. =)

const path = require('path'); //um modulo nativo do node!
//const extractTextPlugin = require('extract-text-webpack-plugin');// DEPRECIADO [foi passado na aula]
const miniCssExtractPlugin = require('mini-css-extract-plugin'); //RECOMENDADO [Ele cria um arquivo CSS por arquivo JS que contém CSS.]
const optimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');//utilizado no build-prod p/ minificação do css
const webpack = require('webpack');//usado p/ tornar publico o modulo jquery e dai este ser encontrado pelo modulo do bootstrap

let pluginsInternos = [];

pluginsInternos.push(
    new miniCssExtractPlugin({
        filename: 'styles.css'
    })
);

pluginsInternos.push(
    new webpack.ProvidePlugin({
        '$': 'jquery/dist/jquery.js',
        'jQuery': 'jquery/dist/jquery.js'
    })
)


if(process.env.NODE_ENV == 'production'){
    pluginsInternos.push(new webpack.optimize.ModuleConcatenationPlugin());/

    pluginsInternos.push(new optimizeCSSAssetsPlugin({
        cssProcessor: require('cssnano'),/
        cssProcessorOptions: {
            discardComments: {
                removeAll: true
            }
        },
        canPrint: true
    }))
}

module.exports = {
    plugins: pluginsInternos,  
    entry: './app-src/app.js', //ponto de entrada. especifico qual será o 1º modulo a ser carregado
    output: { //crie o arquivo bundle.js na pasta dist[esta será criada apartir do diretorio atual 'client', informada pelo _dirname]
        filename: 'bundle.js',
        path: path.resolve(__dirname, 'dist'),//path.resolve() criará o caminho completo até a pasta dist
        publicPath: 'dist'//qdo servidor rodando, o bundle.js é gerado em memoria pelo webpackdevserver. aqui defino que este arquivo estara dentro da past dist
    },
    optimization: {//substituto do CommonsChunkPlugin
        splitChunks: {
            cacheGroups: {
                vendor: {
                    filename: 'vendor.bundle.js', //aqui defino o nome do arquivo a ser gerado
                    test: /[\\/]node_modules[\\/](jquery|bootstrap|reflect-metadata)[\\/]/,//defino quais libs dentro de node_modules quero que fiquem separado neste bunde
                    chunks: 'all'//tipo de otimização[consulte + detalhes na documentação https://webpack.js.org/guides/code-splitting/]
                }
            }
        }
    },
    module: {//o module permite ter varias regras de execução
        rules: [//cada regra pode usar um módulo específico quando aplicada. aqui sera usado o loader
            {
                test: /\.js$/, 
                exclude: /node_modules/,
                use: {
                    loader: 'babel-loader'
                }
            },
            {
                test: /\.css$/, 
                use: [miniCssExtractPlugin.loader, 'css-loader']
                /* use: miniCssExtractPlugin.extract({
11 respostas

Sò que tem um porém!!! Quando gero o vendor.bundle.js, o webpack nao adicionava o Reflect... Olhando o bootstrap, vi que ele possuia uma importação em app.js, sendo assim, REsOlvi add TAMBEM uma importação ao arquivo Reflect.js em app.js (que é o meu arquivo de entrada).

import { NegociacaoController } from './controllers/NegociacaoController.js';
import { Negociacao } from './domain/index.js';

//importo os arquivos CSS como se fossem módulos. O padrão do Webpack já é procurar dentro de node_modules
import 'bootstrap/dist/css/bootstrap.css';

import '../css/meucss.css';
import 'bootstrap/js/dist/modal.js';

import 'reflect-metadata/Reflect.js';//**ADICIONADO**

//testes p saber se deu td certo com os js em escopo global
$('h1').click(() => alert('você me clicou'));
console.log($('h1').modal);

const controller = new NegociacaoController();
const negociacao = new Negociacao(new Date(), 1, 200);
const headers = new Headers();
headers.set('Content-Type', 'application/json');
const body = JSON.stringify(negociacao);
const method = 'POST';

const config = { 
    method,
    headers,
    body 
};

fetch('http://localhost:3000/negociacoes', config)
    .then(() => console.log('Dado enviado com sucesso'));

COm isto, foi incluido o REflect no vendor.bundle.js. Todavia, meu index.html continua não encontrando o mesmo Reflect.defineMetadata na hora de carregar a tabela da pagina!!!! Me ajuda professor!!!!

EU preciso que ele carregue o Reflect.js do vendor.bundle.js,para que então eu retire o script comentado no html!! =(

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width">
    <title>Negociações</title>
    <link rel="stylesheet" href="dist/styles.css"><!-- gerado em memoria pelo webpack.-->
    <link rel="stylesheet" href="dist/1.styles.css"><!-- gerado em memoria pelo webpack.-->
</head>

<body class="container">

    <h1 class="text-center">Negociações</h1>

    <div id="mensagemView"></div>

    <form class="form">

        <div class="form-group">
            <label for="data">Data</label>
            <input type="text" id="data" class="form-control" required autofocus/>
        </div>

        <div class="form-group">
            <label for="quantidade">Quantidade</label>
            <input type="number" min="1" step="1" id="quantidade" class="form-control" value="1" required/>
        </div>

        <div class="form-group">
            <label for="valor">Valor</label>
            <input id="valor" type="number" class="form-control" min="0.01" step="0.01" value="0.0" required />
        </div>

        <button class="btn btn-primary" type="submit">Incluir</button>
    </form>

    <div class="text-center">
        <button id="botao-importa" class="btn btn-primary text-center" type="button">
            Importar Negociações
        </button>
        <button id="botao-apaga" class="btn btn-primary text-center" type="button">
            Apagar
        </button>
    </div>
    <br>
    <br>

    <div id="negociacoes"></div> 

    <!-- <script src="node_modules/reflect-metadata/Reflect.js"></script> -->
    <script src="dist/vendor.bundle.js"></script>
    <script src="dist/bundle.js"></script><!--dist sera gerado pelo webpack. Tal caminho so fica acessivel qdo servidor rodando! Pois fica em memoria Ex:localhost:8080/dist/bundle.js-->

</body>

</html>

Fala ai Adailton, tudo bem? Tente adicionar o Reflect no ProvidePlugin, pode ser que resolva seu problema e o Webpack seja responsável por importá-lo e deixá-lo disponível globalmente no projeto.

Caso não dê certo, compartilhe o projeto completo comigo que eu dou uma olhada aqui para você.

Pode compartilhar através do Github ou Google Drive (zipado).

Espero ter ajudado.

Professor.. Ainda não obtive êxito com esse cidadão... =| Segue o link do meu projeto abaixo com o que produzi até aqui. Quando inspeciono a pagina html, vejo o resultado da implantação do projeto no servidor tudo como esperado: Os modulos separados em um bundle (jquery, bootstrap, reflect)... No outro modulo, os codigos referentes ao projeto. Porém, ele não carrega a tabela da página se comentar o script do Reflect, acusando de não encontrar uma determinada função do Reflect! Na aula do instrutor, ele pede para que nós retiremos tal parte do código, pois caberia ao webpack gerenciar e disponibilizar tal recurso na página. Mas não compreendo o porquÊ de não concretizar a tarefa.

https://drive.google.com/file/d/1SC3zVvd515cb4ZYxIlN8cQtCsWOPaGhq/view?usp=sharing

Retirei o node_modules do compartilhamento como boa prática...

Por sua experiencia, acredito que o 1% que falta desta atividade seja algo despercebido que possa eu ter passado no projeto. Fico no aguardo do seu feedback.. Já vi colegas de classe perguntando no forum como usar este plugin, sendo assim, a solução deste problema irá ajudar muito a mim como os demais que passaram por este que veio pra substituir o 'CommonsChunkPlugin '.

Fala ai Adailton, tudo bem? Você pode resolver o problema importando a core-js no inicio do seu app.js.

// app.js
import 'core-js'

// demais códigos...

E lembre-se de instalá-la:

npm i core-js

Isso deve resolver o problema.

Desculpa a demora, estava com outros pendencias por aqui.

Espero ter ajudado.

solução!

Boa tarde Matheus... Eu havia colocado o core-js abaixo do NegociacaoCOntroller e Negociacao:

import { NegociacaoController } from './controllers/NegociacaoController.js';
import { Negociacao } from './domain/index.js'; 

import 'core-js';//sanar problema com a tag <script> do index.html q n carregava

Quando na verdade, seu feedback informava com clareza que era no INICIO do app.js

import 'core-js';//sanar problema com a tag <script> do index.html q n carregava

import { NegociacaoController } from './controllers/NegociacaoController.js';
import { Negociacao } from './domain/index.js'; 

Estranho Adailton, precisa ver se não faltou nenhum passo ou como você fez.

Porque com o seu projeto essa solução do core-js deu certo.

Talvez tenha faltado você buildar o projeto novamente, limpar algum cache ou coisas do tipo.

Espero ter ajudado.

Desculpa Mateus... Definitivamente resolveu este tópico sua instrução.

Fala Adailton, desculpa mas não entendi.

A solução do core-js deu certo?

Fico no aguardo.

Oi Mateus, boa tarde. A solução deu certo Sim! Eu até editei a parte destacada como 'solução', relatando o que eu havia cometido de errado no código. Mais uma vez, obrigado Mateus pela sua instrução. =)

*Marcado como Solução *

Boa tarde Matheus... Eu havia colocado o core-js abaixo do NegociacaoCOntroller e Negociacao:*

import { NegociacaoController } from './controllers/NegociacaoController.js';
import { Negociacao } from './domain/index.js'; 

import 'core-js';//sanar problema com a tag <script> do index.html q n carregava

Quando na verdade, seu feedback informava com clareza que era no INICIO do app.js

import 'core-js'; //PRIMEIRO IMPORT

import { NegociacaoController } from './controllers/NegociacaoController.js';
import { Negociacao } from './domain/index.js'; 

Boa Adailton, é isso, o import da core-js tem que ser um dos primeiros do projeto.

Sempre que precisar não deixe de criar suas dúvidas.

Abraços e bons estudos.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software