Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

webpack not able to import images( using express and angular2 in typescript)

Tags:

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

like image 484
Sahil Sharma Avatar asked Mar 22 '16 07:03

Sahil Sharma


People also ask

How do I import an image into TypeScript?

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.

Does Webpack Transpile TypeScript?

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.

Does TS-loader use Tsconfig?

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.


1 Answers

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.

like image 92
bestander Avatar answered Oct 01 '22 23:10

bestander