无法在nodejs中使用webpack开发服务器加载图像
Cannot load image using webpack dev server in nodejs
您好,我正在使用以下代码尝试为我的游戏绘制背景,但我一直收到失败消息,我无法弄清楚为什么会发生这种情况。
这是我的 main.js
:
this.background = new Image();
var context = document.getElementById('canvas').getContext('2d');
var loaded = false;
var drawBackground = function () {
loaded = true;
var pattern = context.createPattern(this.background, 'repeat');
context.fillStyle = pattern;
context.fillRect(0, 0, 10000, 10000);
}
this.background.onload = drawBackground;
this.background.src = "../images/bg.jpg";
setTimeout(function() {
if (loaded) {
console.log('success');
} else {
console.log('falilure');
}
}, 3000);
我的文件目录结构是这样的:
- dist
- static
- bg.jpg
- bundle.js
- images
- bg.jpg
- src
- main.js
- server.js
我已经尝试将 this.background.src
更改为 ./static/bg.jpg
,但仍然无效。
我 运行 我的代码在 webpack-dev-server 上使用命令 npm run dev
。在生产中,源代码和静态文件将被复制并捆绑到 dist
目录。但是我正在使用开发模式,所以我猜图像还没有被复制。为什么我的图片没有加载?
经过一天的调整,我找到了解决方案。我在代码中犯了几个错误。
要在 webpack-dev-server 中加载图像,我们需要使用在 webpack.config.js 中配置的加载器(或者您为 webpack-dev-server 的配置文件指定的任何名称)。
所以我将加载程序定义放在模块部分,如下所示:
module: {
loaders: [
{
test: /\.js$/,
loader: 'babel',
include: path.join(__dirname, 'src')
},
{ test: /\.(png|jpg)$/, loader: 'url-loader?limit=90000' }
]
},
棘手的部分来了,单独使用加载程序无法显示您的图像。您必须将其作为 javascript 代码中的资源。所以在问题代码中我需要更改
this.background.src = "../images/bg.jpg";
对此:
this.background.src = require('../images/bg.jpg');
但这仍然不起作用,因为我在同步模型上使用异步调用。
我需要更改 onload 调用以接收回调并在回调中绘制图像。然后代码终于工作了。它看起来像这样:
var image = this.background;
var _canvas = document.getElementById('canvas');
this.ctx = _canvas.getContext('2d');
var drawBackground = function (callback) {
callback(this);
}
image.onload = drawBackground(() => {
let pattern = this.ctx.createPattern(image, 'repeat');
this.ctx.fillStyle = pattern;
this.ctx.fillRect(0, 0, _canvas.width, _canvas.height);
});
image.src = require('../images/bg.jpg');
您好,我正在使用以下代码尝试为我的游戏绘制背景,但我一直收到失败消息,我无法弄清楚为什么会发生这种情况。
这是我的 main.js
:
this.background = new Image();
var context = document.getElementById('canvas').getContext('2d');
var loaded = false;
var drawBackground = function () {
loaded = true;
var pattern = context.createPattern(this.background, 'repeat');
context.fillStyle = pattern;
context.fillRect(0, 0, 10000, 10000);
}
this.background.onload = drawBackground;
this.background.src = "../images/bg.jpg";
setTimeout(function() {
if (loaded) {
console.log('success');
} else {
console.log('falilure');
}
}, 3000);
我的文件目录结构是这样的:
- dist
- static
- bg.jpg
- bundle.js
- images
- bg.jpg
- src
- main.js
- server.js
我已经尝试将 this.background.src
更改为 ./static/bg.jpg
,但仍然无效。
我 运行 我的代码在 webpack-dev-server 上使用命令 npm run dev
。在生产中,源代码和静态文件将被复制并捆绑到 dist
目录。但是我正在使用开发模式,所以我猜图像还没有被复制。为什么我的图片没有加载?
经过一天的调整,我找到了解决方案。我在代码中犯了几个错误。
要在 webpack-dev-server 中加载图像,我们需要使用在 webpack.config.js 中配置的加载器(或者您为 webpack-dev-server 的配置文件指定的任何名称)。
所以我将加载程序定义放在模块部分,如下所示:
module: {
loaders: [
{
test: /\.js$/,
loader: 'babel',
include: path.join(__dirname, 'src')
},
{ test: /\.(png|jpg)$/, loader: 'url-loader?limit=90000' }
]
},
棘手的部分来了,单独使用加载程序无法显示您的图像。您必须将其作为 javascript 代码中的资源。所以在问题代码中我需要更改
this.background.src = "../images/bg.jpg";
对此:
this.background.src = require('../images/bg.jpg');
但这仍然不起作用,因为我在同步模型上使用异步调用。 我需要更改 onload 调用以接收回调并在回调中绘制图像。然后代码终于工作了。它看起来像这样:
var image = this.background;
var _canvas = document.getElementById('canvas');
this.ctx = _canvas.getContext('2d');
var drawBackground = function (callback) {
callback(this);
}
image.onload = drawBackground(() => {
let pattern = this.ctx.createPattern(image, 'repeat');
this.ctx.fillStyle = pattern;
this.ctx.fillRect(0, 0, _canvas.width, _canvas.height);
});
image.src = require('../images/bg.jpg');