【问题标题】:Unable to load images using Webpack file-loader无法使用 Webpack 文件加载器加载图像
【发布时间】:2017-12-17 15:57:38
【问题描述】:

根据file-loader usage documentation,我应该能够加载如下图像:

test: /\.(png|jpg|gif)$/,
use: [
  {
    loader: 'file-loader',
    options: {}  
  }
]

后来通过:

import img from './file.png';

这是我的webpack.config.js

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');

module.exports = {
    module: {
        rules: [
            {
                test: /\.(png|jpg|gif)$/,
                use: [
                    {
                        loader: 'file-loader',
                        options: {}
                    }
                ]
            },
            {
                test: /\.glsl$/,
                loader: 'webpack-glsl-loader'
            },
            {
                test: /\.tsx?$/,
                use: 'ts-loader',
                exclude: /node_modules/
            },
            {
                test: /\.ts$/,
                enforce: 'pre',
                loader: 'tslint-loader',
                options: { failOnHint: true }
            }
        ]
    },
    resolve: {
        extensions: [".tsx", ".ts", ".js"]
    },
    entry: {
        app: './src/index.ts'
    },
    devtool: 'inline-source-map',
    devServer: {
        contentBase: './dist'
    },
    plugins: [
        new CleanWebpackPlugin(['dist']),
        new HtmlWebpackPlugin({
            title: 'Output Manager'
        })
    ],
    output: {
        filename: '[name].bundle.js',
        path: path.resolve(__dirname, 'dist'),
        publicPath: '/'
    }
};

这就是我创建dev-server 的方式:

const app = express();

const compiler = webpack(webpackConfig);

app.use(webpackDevMiddleware(compiler, {
    publicPath: webpackConfig.output.publicPath,
}));

app.listen(3000, () => {
    console.log('Listening on port 3000!\n');
});

另外我的src 结构是这样的:

src
|-images
| |- image.gif
|
|-app.ts

我正在尝试将app.ts中的图片加载如下:

import img from './images/image.gif';

// ...

private loadImage(): void {
    const image = new Image();
    image.src = img;
    image.onload = () => {

    };
}

不幸的是我得到了:

GET http://localhost:8080/undefined404(未找到)

在 Chrome 的开发工具导航器中,我可以在 webpack://./src/images/image.gif 下看到图像文件。内容如下:

module.exports = __webpack_public_path__ + "9b626fa0956bfa785b543ef53e895d5e.gif";


//////////////////
// WEBPACK FOOTER
// ./src/images/image.gif
// module id = 109
// module chunks = 0

此外,如果我在调试时悬停img 变量,我可以看到名称字符串"/9b626fa0956bfa785b543ef53e895d5e.gif"。记录变量会返回 undefined,但永远不会触发 image.onload

如果我在浏览器中调用http://localhost:8080/9b626fa0956bfa785b543ef53e895d5e.gif,我可以看到图像。

知道为什么我无法加载图像,尽管我可以在浏览器中看到它并且路径字符串似乎在那里?

编辑#1:

当我使用 TypeScript 时,我必须声明一个模块才能导入 .gif 文件:

declare module "*.gif" {
  const content: any;
  export default content;
}

然后我发现了这个Github issue,解决这个问题的方法是导入像import * as styles from "styles.scss" 这样的文件。所以我尝试像这样导入:

import * as img from './images/img.gif';

不幸的是,这会导致:

错误 TS2322:类型 'typeof "*.gif"' 不可分配给类型 '字符串'。

【问题讨论】:

    标签: webpack webpack-dev-server webpack-file-loader


    【解决方案1】:

    我在这里看到两个问题。首先,您应该尝试加载您的图像文件,例如import * as img from './images/img.gif';。您还必须在某处使用图像才能实际加载它。单独导入不会触发加载文件。但是一个简单的console.log(img); 应该会触发它。

    第二个问题是你得到这个异常的原因:

    错误 TS2322:类型 'typeof "*.gif"' 不可分配给类型 '字符串'。

    您应该尝试包装导入文件的实际用法,例如:

    if (typeof img === 'string') {
        console.log(img);
    }
    

    这样就不会触发异常了。

    我希望这会有所帮助。

    【讨论】:

    • 将 img 的调用包装到 if 子句中确实解决了问题,ty!
    【解决方案2】:

    这是我的 webpack 配置的 sn-p。这适用于加载图像。

    {
        test: /\.(gif|png|jpe?g)$/i,
        exclude: [/node_modules/],
        loaders: [
            'file-loader?hash=sha512&digest=hex&name=[hash].[ext]',
            'image-webpack-loader'
        ]
    }
    

    【讨论】:

    • 你能像这样改变路径吗?注意 2 个点。从 '../images/img.gif' 导入 * as img;
    猜你喜欢
    • 2016-10-06
    • 2021-02-12
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    相关资源
    最近更新 更多