如何用webpack导入css?

时间:2017-09-21 09:52:58

标签: css node.js twitter-bootstrap webpack vue.js

两部分问题

我的步骤:

  1. 创建空文件夹
  2. opend cmd
  3. 导航到文件夹并运行npm init -f
  4. 运行vue init webpack
  5. 运行npm install
  6. npm i bootstrap-vue
  7. npm run dev
  8. 我的main.js:

    import Vue from 'vue'
    import App from './App'
    import router from './router'
    
    import BootstrapVue from 'bootstrap-vue'
    import 'bootstrap/dist/css/bootstrap.css'
    import 'bootstrap-vue/dist/bootstrap-vue.css'
    
    Vue.use(BootstrapVue);
    
    Vue.config.productionTip = false
    
    /* eslint-disable no-new */
    new Vue({
        el: '#app',
        router,
        render: h => h(App)
    })
    

    webpack.base.conf.js:

    var path = require('path')
    var utils = require('./utils')
    var config = require('../config')
    var vueLoaderConfig = require('./vue-loader.conf')
    
    function resolve(dir) {
        return path.join(__dirname, '..', dir)
    }
    
    module.exports = {
        entry: {
            app: './src/main.js'
        },
        output: {
            path: config.build.assetsRoot,
            filename: '[name].js',
            publicPath: process.env.NODE_ENV === 'production' ?
                config.build.assetsPublicPath : config.dev.assetsPublicPath
        },
        resolve: {
            extensions: ['.js', '.vue', '.json'],
            alias: {
                '@': resolve('src'),
            }
        },
        module: {
            rules: [{
                    test: /\.vue$/,
                    loader: 'vue-loader',
                    options: vueLoaderConfig
                },
                {
                    test: /\.js$/,
                    loader: 'babel-loader',
                    include: [resolve('src'), resolve('test')]
                },
                {
                    test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
                    loader: 'url-loader',
                    options: {
                        limit: 10000,
                        name: utils.assetsPath('img/[name].[hash:7].[ext]')
                    }
                },
                {
                    test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
                    loader: 'url-loader',
                    options: {
                        limit: 10000,
                        name: utils.assetsPath('media/[name].[hash:7].[ext]')
                    }
                },
                {
                    test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
                    loader: 'url-loader',
                    options: {
                        limit: 10000,
                        name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
                    }
                },
                { //this rule will only be used for any vendors
                    test: /\.css$/,
                    loaders: ['style-loader', 'css-loader'],
                    include: [/node_modules/]
                },
                {
                    test: /\.css$/,
                    loaders: ['to-string-loader', 'css-loader'],
                    exclude: [/node_modules/] //add this line so we ignore css coming from node_modules
                },
    
                {
                    test: /\.css$/,
                    use: [
                        'style-loader',
                        'css-loader'
                    ]
                }
            ]
        }
    }
    

    当我跑步时,我得到:

      

    模块构建失败:未知单词(5:1)

    enter image description here

    第2部分:

    经过一段时间,通过安装一个加载程序包并将我的main.js改为此问题,找到了上述问题的解决方案:

    import Vue from 'vue'
    import App from './App'
    import router from './router'
    
    
    import '!style-loader!css-loader!bootstrap/dist/css/bootstrap.css';
    
    
    /* eslint-disable no-new */
    new Vue({
        el: '#app',
        router,
        render: h => h(App)
    })
    

    这解决了我的第一个问题但是

    如果我尝试添加这样的本地css文件:

    import Vue from 'vue'
    import App from './App'
    import router from './router'
    
    
    import '!style-loader!css-loader!bootstrap/dist/css/bootstrap.css';
    import './content/bootstrapGrid.css'
    
    /* eslint-disable no-new */
    new Vue({
        el: '#app',
        router,
        render: h => h(App)
    })
    

    我再次得到同样的错误:

      

    模块构建失败:未知单词(5:1)

    enter image description here

    我是webpack,vue和整个SPA的新手。 现在已经有一段时间了,我陷入了困境,任何人都可以看到我所缺少的东西?

1 个答案:

答案 0 :(得分:2)

<强>!CSS-装载机

这是普通的css加载器。它将返回解释内部资源的css代码,但不会将其添加到页面中。 使用此加载器,@ import和url(...)将被解释为require()并将被解析。

!风格装载机

此加载器通过注入或标记将DOM添加到DOM。 要注入一个你需要获取css文件的内容,然后注入它。

require("style!raw!./file.css");
// => add rules in file.css to document

但是建议将它与css-loader结合使用,因为它将解释你的css文件中的所有资源,而不是只有原始的css。 (Check

require("style!css!./file.css");
// => add rules in file.css to document

如果要添加到css文件,首先需要获取该文件的URL,因为您可以使用文件加载器。

require("style/url!file!./file.css");
// => add a <link rel="stylesheet"> to file.css to document

希望这有帮助!

参考:css-loaderstyle-loader 关于这个here

的好文章