Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
137 views
in Technique[技术] by (71.8m points)

javascript - How to import CSS files into webpack?

According to the documentation, CSS file should just be imported.

I am just starting with webpack and tried to import a CSS file but I get a message about a module missing:

D:Dropboxdevjekylllog>webpack --display-error-details
Hash: 0cabc1049cbcbdb8d134
Version: webpack 2.6.1
Time: 74ms
   Asset     Size  Chunks             Chunk Names
build.js  2.84 kB       0  [emitted]  main
   [0] ./webpack/entry.js 47 bytes {0} [built]

ERROR in ./webpack/entry.js
Module not found: Error: Can't resolve 'navbar.css' in 'D:Dropboxdevjekylllogwebpack'
resolve 'navbar.css' in 'D:Dropboxdevjekylllogwebpack'
  Parsed request is a module
  using description file: D:Dropboxdevjekylllogpackage.json (relative path: ./webpack)
    Field 'browser' doesn't contain a valid alias configuration
  after using description file: D:Dropboxdevjekylllogpackage.json (relative path: ./webpack)
    resolve as module
      D:Dropboxdevjekylllogwebpack
ode_modules doesn't exist or is not a directory
      D:Dropboxdevjekyll
ode_modules doesn't exist or is not a directory
      D:Dropboxdev
ode_modules doesn't exist or is not a directory
      D:Dropbox
ode_modules doesn't exist or is not a directory
      D:
ode_modules doesn't exist or is not a directory
      looking for modules in D:Dropboxdevjekylllog
ode_modules
        using description file: D:Dropboxdevjekylllogpackage.json (relative path: ./node_modules)
          Field 'browser' doesn't contain a valid alias configuration
        after using description file: D:Dropboxdevjekylllogpackage.json (relative path: ./node_modules)
          using description file: D:Dropboxdevjekylllogpackage.json (relative path: ./node_modules/navbar.css)
            as directory
              D:Dropboxdevjekylllog
ode_modules
avbar.css doesn't exist
            no extension
              Field 'browser' doesn't contain a valid alias configuration
              D:Dropboxdevjekylllog
ode_modules
avbar.css doesn't exist
            .js
              Field 'browser' doesn't contain a valid alias configuration
              D:Dropboxdevjekylllog
ode_modules
avbar.css.js doesn't exist
            .json
              Field 'browser' doesn't contain a valid alias configuration
              D:Dropboxdevjekylllog
ode_modules
avbar.css.json doesn't exist
[D:Dropboxdevjekylllogwebpack
ode_modules]
[D:Dropboxdevjekyll
ode_modules]
[D:Dropboxdev
ode_modules]
[D:Dropbox
ode_modules]
[D:
ode_modules]
[D:Dropboxdevjekylllog
ode_modules
avbar.css]
[D:Dropboxdevjekylllog
ode_modules
avbar.css]
[D:Dropboxdevjekylllog
ode_modules
avbar.css.js]
[D:Dropboxdevjekylllog
ode_modules
avbar.css.json]
 @ ./webpack/entry.js 1:0-21

webpack is ran against the following webpack.config.js:

const path = require('path');

module.exports = {
  entry: path.join(__dirname, 'webpack/entry.js'),
  output: {
    path: path.join(__dirname, 'dist'),
    filename: 'build.js'
  },
  module: {
    loaders: [
      {
        test: /.js$/,
        loader: 'babel-loader',
        exclude: /node_modules/
      }
    ],
    rules: [{
            test: /.css$/,
            use: [ 'style-loader', 'css-loader' ]
        }]
  }
}

I initially thought (before using --display-error-details) that this was due to some problems with the path structure (specifically forward vs. backward slashes) but then moved navbar.css into the root of the folder webpack - same issue.

The detailed error shows that the CSS file is sought after in nodes_module (which is hunted down though all the directories tree). Why? How should I then import a file which is in webpack/static/css/myfile.css relative to the location of webpack.config.js?

Note: the same issue exists when trying require instead of import

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You have to import them like any JavaScript module. That means, when the imported file is neither a relative path (starting with ../ or ./), nor an absolute path (starting with /), it is resolved as a module. By default webpack will look for modules in the node_modules directory (in the current directory and all parent directories). This is the same behaviour that Node.js uses.

To import webpack/static/css/myfile.css in webpack/entry.js you have to use a relative path.

import './static/css/myfile.css';

If you don't want to use a relative path, you can change the directories that webpack uses to find a module with the resolve.modules or you can use resolve.alias.


In your webpack config you also defined both module.rules and module.loaders. When webpack sees module.rules it ignores module.loaders completely, so your babel-loader wouldn't be used. You should only use module.rules.

module: {
  rules: [
    {
      test: /.js$/,
      loader: 'babel-loader',
      exclude: /node_modules/
    },
    {
      test: /.css$/,
      use: ['style-loader', 'css-loader']
    }
  ]
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...