Webpack相对于带文件加载器/ css-loader的css url()

时间:2017-05-26 14:42:30

标签: webpack css-loader webpack-file-loader

我对webpack / npm很新,我试图了解如何在其他项目依赖项中使用css网址。

文件夹结构

src
  fonts/
  scss/
    app.scss
  js/
    app.js
  img/
  index.html

webpack.config.js

var path = require('path');
var extractPlugin = require('extract-text-webpack-plugin');
var cleanWebpackPlugin = require('clean-webpack-plugin');
var htmlWebpackPlugin = require('html-webpack-plugin');
var webpack = require("webpack");

module.exports = {
    entry: './src/js/app.js',
    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'js/app.js'
    },
    devServer: {
        stats: 'errors-only',
        compress: true,
        open: true,
        port: 9000
    },
    module: {

        rules: [

            // ES6 -> ES5 transpiler

            {
                test: /\.js$/,
                exclude: /node_modules/,
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['es2015']
                    }
                }
            }, 

            // SCSS to CSS -> Autoprefix -> Load CSS

            {
                test: /\.(scss|css)$/,
                use: extractPlugin.extract({
                    use: [
                        'css-loader',
                        {
                            loader: 'postcss-loader', 
                            options: { 
                                plugins: (loader) => [require('autoprefixer')()]
                            }
                        },
                        'sass-loader'
                    ]
                })
            },

            // HTML Loader
            {
                test: /\.html$/,
                use: ['html-loader']
            },

            // Image Loader
            {
                test: /\.(jpg|png|svg|gif)$/,
                use: [
                    {
                        loader: 'file-loader',
                        options: {
                            outputPath: 'img/',
                            name: '[name].[ext]'
                        }
                    }
                ]
            },
            // Font Loader
            {
                test: /\.(eot|ttf|woff)$/,
                use: [
                    {
                        loader: 'file-loader',
                        options: {
                            outputPath: 'fonts/',
                            name: '[name].[ext]'
                        }
                    }
                ]
            }


        ]

    }, 
    plugins: [
        new extractPlugin({filename: 'scss/app.css'}),
        new cleanWebpackPlugin(['dist']),
        new htmlWebpackPlugin({ template: 'src/index.html' }),
        new webpack.ProvidePlugin({ $: 'jquery', jQuery: 'jquery', 'window.jQuery': 'jquery' })
    ]
};

我已成功将lightGallery包含在我的项目中,如下所示:

app.js

import 'lightgallery';

app.scss

@import '~lightgallery/dist/css/lightgallery.css';

灯库样式表引用了我使用webpack fonts/

成功加载到file-loader的字体

我的问题是构建的css文件试图引用相对于scss文件夹的字体而不是我的root。

ie:http://localhost:9000/scss/img/loading.gif

我需要从css链接的所有资产从我的根目录

解析

http://localhost:9000/img/loading.gif

无论如何,我可以将我的css-loader配置为使用/添加所有网址吗?

帮助!

1 个答案:

答案 0 :(得分:5)

file-loader尊重output.publicPath,但由于您没有设置它,因此生成的路径将是相对路径。您可以将公共路径设置为/

output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'js/app.js',
    publicPath: '/'
},

这将影响其他处理任何资产的加载器和插件。这通常是您想要的,因此建议使用,但如果您只想更改特定文件,可以使用publicPath上的file-loader选项。

{
    loader: 'file-loader',
    options: {
        outputPath: 'img/',
        name: '[name].[ext]',
        publicPath: '/'
    }
}