Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Webpack + React + Typescript

Is it possible to use webpack with React and Typescript and be able to bundle those into a web bundle, but still be able to debug original TypeScript and React code? In webpack I'm using ts-loader and ts-jsx-loader plus devtool: "source-map", but when I try to do browser debugging, I can't see original ts code but instead I see code which has been changed by webpack.

My current basic webpack.config.js file:

var webpack = require('webpack');
module.exports = {
  entry: ['./app/main.ts'],
  output: {
    path: './build',
    filename: 'bundle.js'
  },
  debug: true,
  devtool: 'source-map',
  plugins: [
    new webpack.optimize.DedupePlugin(),
    new webpack.optimize.UglifyJsPlugin()
  ],
  resolve: {
    extensions: ['', '.ts', '.js']
  },
  module: {
    loaders: [
      {
        test: /\.ts$/,
        loader: 'ts-loader!ts-jsx-loader'
      }
    ]
  }
};

tsconfig.json:

{
    "compileOnSave": false,
    "version": "1.5.0-alpha",
    "compilerOptions": {
        "target": "es5",
        "module": "commonjs",
        "noLib": false,
        "sourceMap": true,
        "noImplicitAny": true,
        "removeComments": true
    },
    "files": [
        "./AppComponent.ts",
        "./libs/jsx.d.ts",
        "./libs/react.d.ts",
        "./libs/webpack-runtime.d.ts",
        "./main.ts"
    ]
}

For example - my oryginal .ts file looks like:

import React = require('react');

class AppComponent extends React.Component<any, any> {
  render () {
    return React.jsx(`
      <h1>He world!</h1>
    `);
  }
};
export = AppComponent;

and in chrome debugger it looks like this:

var __extends = this.__extends || function (d, b) {
    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
    function __() { this.constructor = d; }
    __.prototype = b.prototype;
    d.prototype = new __();
};
var React = __webpack_require__(2);
var AppComponent = (function (_super) {
    __extends(AppComponent, _super);
    function AppComponent() {
        _super.apply(this, arguments);
    }
    AppComponent.prototype.render = function () {
        return (React.createElement("h1", null, "He world!"));
    };
    return AppComponent;
})(React.Component);
;
module.exports = AppComponent;


/*****************
 ** WEBPACK FOOTER
 ** ./app/AppComponent.ts
 ** module id = 158
 ** module chunks = 0
 **/
like image 400
barylov Avatar asked Jul 13 '15 17:07

barylov


2 Answers

You don't need to use the ts-jsx-loader.

In your tsconfig.json file you just need something like this:

{
  "compilerOptions": {
    "jsx": "react",
    "sourceMap": true,
    // ... other options
  }
}

And of course, you still need the devtool option in the webpack config file

like image 136
thitemple Avatar answered Oct 21 '22 11:10

thitemple


It's likely that you have not specified sourceMap in your tsconfig.json file, so the TypeScript compiler is not outputting sourcemaps.

like image 1
James Brantly Avatar answered Oct 21 '22 12:10

James Brantly