Solucionado (ver solução)
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