Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
12
respostas

./node_modules/css-loader!./node_modules/style-loader!./node_modules/css-loader!./node_modules/bootstrap/dist/css/bootstrap.css Module build failed: Unknown word (5:1)

Olá,

Terminei o curso completo e estou criando uma aplicação do zero para consolidar meus conhecimentos. Porém, quando eu vou adicionar o bootstrap, eu recebe este erro:

Failed to compile.

./node_modules/css-loader!./node_modules/style-loader!./node_modules/css-loader!./node_modules/bootstrap/dist/css/bootstrap.css
Module build failed: Unknown word (5:1)

  3 | // load the styles
  4 | var content = require("!!../../../css-loader/index.js!./bootstrap.css");
> 5 | if(typeof content === 'string') content = [[module.id, content, '']];
    | ^
  6 | // add the styles to the DOM
  7 | var update = require("!../../../style-loader/addStyles.js")(content, {});
  8 | if(content.locals) module.exports = content.locals;

 @ ./node_modules/bootstrap/dist/css/bootstrap.css 4:14-131 13:3-17:5 14:22-139
 @ ./src/main.js
 @ multi (webpack)-dev-server/client?http://localhost:8080 webpack/hot/dev-server ./src/main.js

Meu main está assim: 

import Vue from 'vue'
import App from './App.vue'
import VueResource from 'vue-resource'
import VueRouter from 'vue-router'
import VeeValidate from 'vee-validate'
import { routes } from './routes.js'

import 'bootstrap/dist/css/bootstrap.css'
import 'bootstrap/dist/js/bootstrap.js';
import 'jquery/dist/jquery.js';

Vue.use(VueResource);
Vue.use(VueRouter);
Vue.use(VeeValidate);


const router = new VueRouter({
  routes: routes,
  mode: 'history'
})

new Vue({
  el: '#app',
  router: router,
  render: h => h(App)
})

Meu webpack.config.js está assim: 

var path = require('path')
var webpack = require('webpack')

module.exports = {
  entry: './src/main.js',
  output: {
    path: path.resolve(__dirname, './dist'),
    publicPath: '/dist/',
    filename: 'build.js'
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          'vue-style-loader',
          'css-loader'
        ],
      },
      {
        test: /\.scss$/,
        use: [
          'vue-style-loader',
          'css-loader',
          'sass-loader'
        ],
      },
      {
        test: /\.sass$/,
        use: [
          'vue-style-loader',
          'css-loader',
          'sass-loader?indentedSyntax'
        ],
      },
      {
        test: /\.vue$/,
        loader: 'vue-loader',
        options: {
          loaders: {
            // Since sass-loader (weirdly) has SCSS as its default parse mode, we map
            // the "scss" and "sass" values for the lang attribute to the right configs here.
            // other preprocessors should work out of the box, no loader config like this necessary.
            'scss': [
              'vue-style-loader',
              'css-loader',
              'sass-loader'
            ],
            'sass': [
              'vue-style-loader',
              'css-loader',
              'sass-loader?indentedSyntax'
            ]
          }
          // other vue-loader options go here
        }
      },
      {
        test: /\.js$/,
        loader: 'babel-loader',
        exclude: /node_modules/
      },
      {
        test: /\.(png|jpg|gif|svg)$/,
        loader: 'file-loader',
        options: {
          name: '[name].[ext]?[hash]'
        }
      },
      { test: /\.css$/, loader: 'style-loader!css-loader' },
      { test: /\.(woff|woff2)(\?v=\d+\.\d+\.\d+)?$/, loader: 'url-loader?limit=10000&mimetype=application/font-woff' },
      { test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, loader: 'url-loader?limit=10000&mimetype=application/octet-stream' },
      { test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, loader: 'file-loader' },
      { test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, loader: 'url-loader?limit=10000&mimetype=image/svg+xml' }
    ]
  },
  resolve: {
    alias: {
      'vue$': 'vue/dist/vue.esm.js'
    },
    extensions: ['*', '.js', '.vue', '.json']
  },
  devServer: {
    historyApiFallback: true,
    noInfo: true,
    overlay: true
  },
  performance: {
    hints: false
  },
  devtool: '#eval-source-map',
  plugins: [
    new webpack.ProvidePlugin({
      $: 'jquery/dist/jquery.js',
      jQuery: 'jquery/dist/jquery.js'
    })
  ]
}

if (process.env.NODE_ENV === 'production') {
  module.exports.devtool = '#source-map'
  // http://vue-loader.vuejs.org/en/workflow/production.html
  module.exports.plugins = (module.exports.plugins || []).concat([
    new webpack.DefinePlugin({
      'process.env': {
        NODE_ENV: '"production"'
      }
    }),
    new webpack.optimize.UglifyJsPlugin({
      sourceMap: true,
      compress: {
        warnings: false
      }
    }),
    new webpack.LoaderOptionsPlugin({
      minimize: true
    })
  ])
}

Segui os mesmos passos do curso. Se puderem me ajudar, por favor.

Obrigado!

12 respostas

Você segui os mesmos passos e instalou os mesmos arquivos? Usou exatamente a mesma versão que usei do Vue CLI? Esta usando qual versão do bootstrap? Compartilha essas informações conosco.

Olá Flavio,

Por ser um pouco grande, inseri a minha dúvida no GIST. Acredito que esteja bem completa a explanação. Poderia, por favor, me ajudar?

https://gist.github.com/pedroarvellos/af5d296d524b3b8427b365dbdcb54714

Obrigado!

Olhei seu código no gist (com um pouco de dificuldade, porque para mim é mais fácil ler no fórum) e não consegui detectar o problema no seu código.

Você pode postar sua dúvida do gits, mesmo grande aqui? Isso permite que outros alunos, moderadores e instrutores a vejam com mais facilidade.

Você não me disse se mudou a versão do Vue, qual versão do Bootstrap utilizou, etc. Isso é importante.

Olá Flavio,

Segue a versão de cada dependência:

{
  "name": "exercise-yourself",
  "description": "A Vue.js project",
  "version": "1.0.0",
  "author": "Pedro Arvellos <pedroarvellos@hotmail.com>",
  "license": "MIT",
  "private": true,
  "scripts": {
    "dev": "cross-env NODE_ENV=development webpack-dev-server --open --hot",
    "build": "cross-env NODE_ENV=production webpack --progress --hide-modules"
  },
  "dependencies": {
    "bootstrap": "^3.3.7",
    "jquery": "^3.1.1",
    "vue": "^2.5.11"
  },
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not ie <= 8"
  ],
  "devDependencies": {
    "babel-core": "^6.26.0",
    "babel-loader": "^7.1.2",
    "babel-preset-env": "^1.6.0",
    "babel-preset-stage-3": "^6.24.1",
    "cross-env": "^5.0.5",
    "css-loader": "^0.25.0",
    "file-loader": "^1.1.4",
    "style-loader": "^0.13.1",
    "url-loader": "^0.5.7",
    "vue-loader": "^13.0.5",
    "vue-template-compiler": "^2.4.4",
    "webpack": "^3.6.0",
    "webpack-dev-server": "^2.9.1"
  }
}

Em relação à postar aqui, visto que o tamanho do texto excede o tamanho máximo permitido para postar aqui, eu vou enviar ele, em seguida, em duas mensagens, tudo bem?!

Abraço!

Pedro

Olá Flavio,

Agora o cenário mudou. Refiz todo o processo, baixei todas as dependências (exatamente as mesmas do projeto), e fiz as devidas importações. Para testar o Bootstrap, copiei um nav-bar default do site, e colei no meu template, minha classe vue ficou assim:

<template>
  <div class="container"> 
    <nav class="navbar navbar-expand-lg navbar-light bg-light">
      <a class="navbar-brand" href="#">Navbar</a>
      <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
      </button>

      <div class="collapse navbar-collapse" id="navbarSupportedContent">
        <ul class="navbar-nav mr-auto">
          <li class="nav-item active">
            <a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="#">Link</a>
          </li>
          <li class="nav-item dropdown">
            <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
              Dropdown
            </a>
            <div class="dropdown-menu" aria-labelledby="navbarDropdown">
              <a class="dropdown-item" href="#">Action</a>
              <a class="dropdown-item" href="#">Another action</a>
              <div class="dropdown-divider"></div>
              <a class="dropdown-item" href="#">Something else here</a>
            </div>
          </li>
          <li class="nav-item">
            <a class="nav-link disabled" href="#">Disabled</a>
          </li>
        </ul>
        <form class="form-inline my-2 my-lg-0">
          <input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search">
          <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
        </form>
      </div>
    </nav>
  </div>
</template>

<script>
export default {
  name: 'app',
  data () {
    return {
    }
  }
}
</script>

<style>

</style>

... Continuação

Por fim, o estilo não aparece, o resultado é que o nav-bar fica completamente quebrado, como se o bootstrap não tivesse sido colocado. Como disse, importei tudo que precisava e na versão correta (Bootstrap, jQuery e os loaders). Além disto, configurei tudo conforme o curso mostrou. A seguir, apresento o meu main e o meu webpack.config.js:

main:

import Vue from 'vue'
import App from './App.vue'
import 'bootstrap/dist/css/bootstrap.css';
import 'bootstrap/dist/js/bootstrap.js';

new Vue({
  el: '#app',
  render: h => h(App)
})

webpack.config,js:

var path = require('path')
var webpack = require('webpack')

module.exports = {
  entry: './src/main.js',
  output: {
    path: path.resolve(__dirname, './dist'),
    publicPath: '/dist/',
    filename: 'build.js'
  },
  module: {
    rules: [
     {
        test: /\.vue$/,
        loader: 'vue-loader',
        options: {
          loaders: {

          }
          // other vue-loader options go here
        }
      },
      {
        test: /\.js$/,
        loader: 'babel-loader',
        exclude: /node_modules/
      },
      {
        test: /\.(png|jpg|gif|svg)$/,
        loader: 'file-loader',
        options: {
          name: '[name].[ext]?[hash]'
        }
      }, 
      { test: /\.css$/, loader: 'style-loader!css-loader' },
      { test: /\.(woff|woff2)(\?v=\d+\.\d+\.\d+)?$/, loader: 'url-loader?limit=10000&mimetype=application/font-woff' },
      { test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, loader: 'url-loader?limit=10000&mimetype=application/octet-stream' },
      { test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, loader: 'file-loader' },
      { test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, loader: 'url-loader?limit=10000&mimetype=image/svg+xml' }
    ]
  },
  resolve: {
    alias: {
      'vue$': 'vue/dist/vue.esm.js'
    },
    extensions: ['*', '.js', '.vue', '.json']
  },
  devServer: {
    historyApiFallback: true,
    noInfo: true,
    overlay: true
  },
  performance: {
    hints: false
  },
  devtool: '#eval-source-map',
  plugins: [
    new webpack.ProvidePlugin({
       $: 'jquery/dist/jquery.js',
       jQuery: 'jquery/dist/jquery.js'
   })
]
}

if (process.env.NODE_ENV === 'production') {
  module.exports.devtool = '#source-map'
  // http://vue-loader.vuejs.org/en/workflow/production.html
  module.exports.plugins = (module.exports.plugins || []).concat([
    new webpack.DefinePlugin({
      'process.env': {
        NODE_ENV: '"production"'
      }
    }),
    new webpack.optimize.UglifyJsPlugin({
      sourceMap: true,
      compress: {
        warnings: false
      }
    }),
    new webpack.LoaderOptionsPlugin({
      minimize: true
    })
  ])
}

Qual versão do Vue CLI você utilizou? Isso não diz no package.json. Usou a mesma que utilizei no curso?

Olá Flavio,

A partir do comando " vue --version" o retorno é: a versão 2.7.0, que, no caso, é a mesma versão do curso.

Pedro Arvellos

Flavio,

Além disto, eu baixei o arquivo completo feito no curso (com truques, onde foi importado o bootstrap), e, para testar, peguei um componente nav qualquer no site do bootstrap (https://getbootstrap.com/docs/4.0/components/navbar/) e tentei inserir, não funcionou, ele quebrou todo. O componente que tentei inserir foi este:

<nav class="navbar navbar-expand-lg navbar-light bg-light">
  <a class="navbar-brand" href="#">Navbar</a>
  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
    <span class="navbar-toggler-icon"></span>
  </button>

  <div class="collapse navbar-collapse" id="navbarSupportedContent">
    <ul class="navbar-nav mr-auto">
      <li class="nav-item active">
        <a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a>
      </li>
      <li class="nav-item">
        <a class="nav-link" href="#">Link</a>
      </li>
      <li class="nav-item dropdown">
        <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
          Dropdown
        </a>
        <div class="dropdown-menu" aria-labelledby="navbarDropdown">
          <a class="dropdown-item" href="#">Action</a>
          <a class="dropdown-item" href="#">Another action</a>
          <div class="dropdown-divider"></div>
          <a class="dropdown-item" href="#">Something else here</a>
        </div>
      </li>
      <li class="nav-item">
        <a class="nav-link disabled" href="#">Disabled</a>
      </li>
    </ul>
    <form class="form-inline my-2 my-lg-0">
      <input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search">
      <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
    </form>
  </div>
</nav>

Poderia verificar, por favor, se, de fato, a importação do bootstrap está funcionando plenamente, ou se eu estou copiando um elemento do bootstrap de forma errada (ou fazendo qualquer outra coisa errada)?

Obrigado,

Pedro

Coloque no seu projeto:

<p class="alert alert-danger">Estou vermelho?</p>

Se aparecer é porque o bootstrap foi carregado.

Você é o primeiro aluno a reportar no curso que não conseguiu importar o bootstrap, aliás, veremos se não foi importado mesmo com o teste que lhe propus.

Uma coisa estranha é que seu webpack.config.js esta diferente do que eu ensino no curso. Há mais configurações.

solução!

Olha! Você esta usando um exemplo do bootstrap 4.0!

E no seu package.json você instalou o Boostrap 3!

Bootstrap 4.0 mudou nomes de classes de vários componentes. Pegue um exemplo do Boostrap 3.0.

Com, se não for isso, não faço ideia de qual seja o problema. Vamos deixar em aberto para ver se mais alguém consegue ajudar.

Olá Flavio,

Muito bem, você matou o problema. Estava utilizando a última versão e nem havia me dado conta disto. Foi descuido meu.

Muito obrigado!

Pedro