I am not able to import images in my headercomponent.ts. I suspect it is because of something i am doing wrong while compiling ts(using webpack ts loader) because same thing works with react( where the components are written in es6)
The error location is
//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>
my webpack config is
// 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' };
and my directory structure looks like this
-/ -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
my tsconfig file is as follows:
//tsconfig.json { "compilerOptions": { "target": "es5", "sourceMap": true, "emitDecoratorMetadata": true, "experimentalDecorators": true, "removeComments": false, "noImplicitAny": false }, "exclude": [ "node_modules" ] }
I suspect I am messing some thing in typescript compilation , not sure what
To allow image import with TypeScript, we can use declare to declare the type for image files. to declare the type for modules with the . png extension.
Like Babel, Webpack depends on TSC to transpile TypeScript to JavaScript but as TSC doesn't have a clue about Webpack, hence Webpack needs a loader to talk to TSC. This is where the ts-loader comes into play. Webpack compiles a TypeScript file using ts-loader package which asks TSC to do the compilation.
ts-loader uses tsc , the TypeScript compiler, and relies on your tsconfig. json configuration. Make sure to avoid setting module to "CommonJS", or webpack won't be able to tree-shake your code.
The problem is that you confuse TypeScript level modules and Webpack level modules.
In Webpack any file that you import goes through some build pipeline.
In Typescript only .ts
and .js
files are relevant and if you try to import x from file.png
TypeScript just does not know what to do with it, Webpack config is not used by TypeScript.
In your case you need to separate the concerns, use import from
for TypeScript/EcmaScript code and use require
for Webpack specifics.
You would need to make TypeScript ignore this special Webpack require
syntax with a definition like this in a .d.ts
file:
declare function require(string): string;
This will make TypeScript ignore the require statements and Webpack will be able to process it in the build pipeline.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With