Usage of ChartJS v3 with TypeScript and Webpack
Asked Answered
U

1

6

Up until release 2.9.4, I used ChartJS in combination with @types/chart.js to get all the types for TypeScript support. My working minimal example with Webpack and TypeScript looks as follows:

package.json:

{
  "devDependencies": {
    "@types/chart.js": "^2.9.31",
    "ts-loader": "^8.1.0",
    "typescript": "^4.2.3",
    "webpack": "^5.30.0",
    "webpack-cli": "^4.6.0",
    "webpack-dev-server": "^3.11.2"
  },
  "dependencies": {
    "chart.js": "^2.9.4"
  }
}

tsconfig.json:

{
  "compilerOptions": {
    "esModuleInterop": true,
  },
}

webpack.config.json:

module.exports = {
  entry: {
    main: "./main.ts",
  },
  module: {
    rules: [
      {
        test: /\.ts$/,
        loader: "ts-loader",
        exclude: /node_modules/,
      },
    ],
  },
};

main.ts:

import Chart from "chart.js";

new Chart("chart", {
  type: 'line',
  data: {
    labels: ['Label 1', 'Label 2', 'Label 3'],
    datasets: [{
      label: "Dataset 1",
      data: [1, 2, 3],
    }]
  },
});

index.html:

<!DOCTYPE html>
<html>
  <body>
    <canvas id="chart"></canvas>
    <script src="main.js"></script>
  </body>
</html>

But after updating to version 3.0.0, this doesn't work anymore (I removed @types/chart.js because chart.js ships its own types since that release):

npx webpack serve --mode development

ERROR in [...]/chartjs/main.ts
./main.ts 3:4-9
[tsl] ERROR in [...]/chartjs/main.ts(3,5)
      TS2351: This expression is not constructable.
  Type 'typeof import("[...]/chartjs/node_modules/chart.js/types/index.esm")' has no construct signatures.

But since the inbuilt class Chart does in fact have a constructor, I don't really understand the problem and how to fix it. What is the intended way of using ChartJS version 3 in combination with Webpack and TypeScript?

Thanks in advance for any tip which leads me into the right direction here!

Unquestioned answered 4/4, 2021 at 22:43 Comment(2)
Did you import and register the controllers, elements, scales and plugins? chartjs.org/docs/latest/getting-started/…Immersionism
@Immersionism Thank you so much, that was exactly the problem. Considering how much time I spent reading the docs, I'm a bit embarrassed right now :) If you post your comment as answer, I will accept it.Unquestioned
I
4

Chart.js 3 is tree-shakeable, so it is necessary to import and register the controllers, elements, scales and plugins you are going to use.

Please take a look at Bundlers (Webpack, Rollup, etc.) from the Chart.js documentation.

Immersionism answered 5/4, 2021 at 13:42 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.