Webpack文件加载器不加载具有复杂路径的文件

时间:2017-08-18 09:39:54

标签: javascript typescript webpack webpack-file-loader

我有一个使用Typescript 2.4.1,Webpack 2.6.1的项目,而且我在获取正确加载图像的相对路径时遇到了一些问题。

如果我将图像放在与加载它的.ts文件相同的文件夹中,我可以让它工作:

const background = require("./background.png");
console.log(background);

这样可行:

src
   Book.ts
   background.png

但我无法弄清楚如何让文件加载器找到具有这种结构的图像:

src
   Book.ts
assets
   background.png

我尝试在文件加载器选项中设置publicPath,如here所述,但无论绝对路径和相对路径的组合如何,我都无法以所有方式加载文件我试过了。

这是我的webpack.config.js文件。 (我删除了一些部分,因为它很长。)

module.exports = {
    entry: {
        app: [
            path.resolve(__dirname, './src/main.ts')
        ],
        vendor: ['pixi', 'p2', 'phaser', 'webfontloader']
    },
    output: {
        pathinfo: true,
        path: path.resolve(__dirname, 'dist'),
        publicPath: './dist/',
        filename: 'bundle.js'
    },
    module: {
        rules: [
            {test: /\.ts$/, enforce: 'pre', loader: 'tslint-loader', options: {emitErrors: true, failOnHint: true}},
            {test: /\.ts$/, loader: 'ts-loader'},
            {test: /pixi\.js/, use: ['expose-loader?PIXI']},
            {test: /phaser-split\.js$/, use: ['expose-loader?Phaser']},
            {test: /p2\.js/, use: ['expose-loader?p2']},
            {test: /\.(png|svg|jpg|gif|mp3|wav|mp4)$/, use: [{
                loader: 'file-loader',
                options: {
                    outputPath: 'assets/'
                }
            }]},
            {enforce: "pre", test: /\.js$/, loader: "source-map-loader"}
        ]
    },
    node: {
        fs: 'empty',
        net: 'empty',
        tls: 'empty'
    }
}

这里我的打字稿需要声明:

declare let require: {
    <T>(path: string): T;
    (paths: string[], callback: (...modules: any[]) => void): void;
    ensure: (paths: string[], callback: (require: <T>(path: string) => T) => void) => void;
};

(我尝试过很好的ES6导入工作,但这并不顺利。)

1 个答案:

答案 0 :(得分:3)

我用文件加载器尝试过它并没有真正起作用......

尝试使用&#34; url-loader&#34;在webpack.config中这样:

  // "url" loader works like "file" loader except that it embeds assets
  // smaller than specified limit in bytes as data URLs to avoid requests.
  // A missing `test` is equivalent to a match.
  {
    test: [/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/],
    loader: require.resolve('url-loader'),
    options: {
      limit: 10000,
      name: 'static/media/[name].[hash:8].[ext]',
    },
  },

然后你可以&#34;只是&#34;用它来获取你可以使用的路径:

const imageSrc = import('./relativePathToImgFile');

编辑:不要忘记将url-loader添加到package.json:)