我无法在headercomponent.ts中导入图片。 我怀疑这是因为我在编译ts时遇到了错误(使用webpack ts loader),因为同样的事情与react一起工作(其中组件是用es6编写的)
错误位置
//headercomponent.ts
import {Component, View} from "angular2/core";
import {ROUTER_DIRECTIVES, Router} from "angular2/router";
import {AuthService} from "../../services/auth/auth.service";
import logoSource from "../../images/logo.png"; //**THIS CAUSES ERROR** Cannot find module '../../images/logo.png'
@Component({
selector: 'my-header',
//templateUrl:'components/header/header.tmpl.html' ,
template: `<header class="main-header">
<div class="top-bar">
<div class="top-bar-title">
<a href="/"><img src="{{logoSource}}"></a>
</div>
我的webpack配置是
// webpack.config.js
'use strict';
var path = require('path');
var autoprefixer = require('autoprefixer');
var webpack = require('webpack');
var ExtractTextPlugin = require('extract-text-webpack-plugin');
var basePath = path.join(__dirname,'public');
//const TARGET = process.env.npm_lifecycle_event;
console.log("bp " + basePath)
module.exports = {
entry: path.join(basePath,'/components/boot/boot.ts'),
output: {
path: path.join(basePath,"..","/build"), // This is where images AND js will go
publicPath: path.join(basePath,"..","/build/assets"),
// publicPath: path.join(basePath ,'/images'), // This is used to generate URLs to e.g. images
filename: 'bundle.js'
},
plugins: [
new ExtractTextPlugin("bundle.css")
],
module: {
preLoaders: [ { test: /\.tsx$/, loader: "tslint" } ],
//
loaders: [
{ test: /\.(png!jpg)$/, loader: 'file-loader?name=/img/[name].[ext]' }, // inline base64 for <=8k images, direct URLs for the rest
{
test: /\.json/,
loader: 'json-loader',
},
{
test: /\.ts$/,
loader: 'ts-loader',
exclude: [/node_modules/]
},
{
test: /\.js$/,
loader: 'babel-loader'
},
{
test: /\.scss$/,
exclude: [/node_modules/],
loader: ExtractTextPlugin.extract("style", "css!postcss!sass?outputStyle=expanded")
},
// fonts and svg
{ test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, loader: "url-loader?limit=10000&mimetype=application/font-woff" },
{ test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, loader: "url-loader?limit=10000&mimetype=application/font-woff" },
{ test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, loader: "url-loader?limit=10000&mimetype=application/octet-stream" },
{ test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, loader: "file" },
{ test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, loader: "url-loader?limit=10000&mimetype=image/svg+xml" }
]
},
resolve: {
// now require('file') instead of require('file.coffee')
extensions: ['', '.ts', '.webpack.js', '.web.js', '.js', '.json', 'es6', 'png']
},
devtool: 'source-map'
};
我的目录结构如下所示
-/
-server/
-build/
-node-modules/
-public/
-components/
-boot/
-boot.component.ts
-header/
-header.component.ts
-images/
-logo.png
-services/
-typings/
-browser/
-main/
-browser.d.ts
-main.d.ts
-tsconfig.json
-typings.json
我的tsconfig文件如下:
//tsconfig.json
{
"compilerOptions": {
"target": "es5",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"removeComments": false,
"noImplicitAny": false
},
"exclude": [
"node_modules"
]
}
我怀疑我在打字稿编译中弄乱了一些东西,不知道是什么
答案 0 :(得分:37)
问题在于您混淆了TypeScript级别模块和Webpack级别模块。
在Webpack中,您导入的任何文件都会通过某个构建管道。
在Typescript中只有.ts
和.js
文件是相关的,如果你尝试import x from file.png
TypeScript只是不知道如何处理它,TypeScript不会使用Webpack配置。< / p>
在您的情况下,您需要分开关注点,使用import from
表示TypeScript / EcmaScript代码,并使用require
表示Webpack细节。
您需要在require
文件中使TypeScript忽略此特殊Webpack .d.ts
语法,并使用此类定义:
declare function require(string): string;
这将使TypeScript忽略require语句,Webpack将能够在构建管道中处理它。
答案 1 :(得分:18)
而不是:
import image from 'pathToImage/image.extension';
使用:
const image = require('pathToImage/image.extension');
答案 2 :(得分:9)
我正在使用
import * as myImage from 'path/of/my/image.png';
并使用
创建了一个打字稿定义declare module "*.png" {
const value: any;
export = value;
}
这只适用于webpack中的文件加载器之类的正确处理程序。因为这个处理程序会为你提供一个文件路径。
答案 3 :(得分:3)
我也有同样的问题所以我使用了以下方法:
import * as myImage from 'path/of/my/image';
在我的组件中,我只是将导入的图像分配给数据成员;
export class TempComponent{
public tempImage = myImage;
}
并在模板中使用它:
<img [src]="tempImage" alt="blah blah blah">
答案 4 :(得分:3)
对Christian Stornowski的答案的一个小改进是出口默认,即
declare module "*.png" {
const value: string;
export default value;
}
因此您可以使用以下方式导入图像:
import myImg from 'img/myImg.png';
答案 5 :(得分:1)
如果要使用ES6语法进行导入。
首先请确保您的tsconfig.json
中有:
target: 'es5',
module: 'es6'
以下内容现在应该可以工作:
import MyImage from './images/my-image.png';
答案 6 :(得分:0)
要能够使用像这样的默认导入:
import grumpyCat from '../assets/grumpy_cat.jpg';
定义jpg
模块声明:
declare module "*.jpg" {
const value: string;
export default value;
}
,然后在您的tsconfig
中使用"module": "es6"
(请参阅@vedran comment above),或者在使用"module": "commonjs"
时添加"esModuleInterop": true,
"compilerOptions": {
"module": "commonjs",
"target": "es5",
"esModuleInterop": true,
...
来源:https://github.com/TypeStrong/ts-loader/issues/344#issuecomment-381398818