Skip to content

Get webpack working #1

Description

@jonfroehlich

I just spent five frustating hours trying to get webpack working. And it never did.

I'm struggling to produce a reusable js library with webpack. This is my first attempt. Here are the relevant files:

The package.json

{
  "name": "makelab-lib",
  "version": "0.0.1",
  "description": "A library for the Makeability Lab",
  "main": "dist/makelab.bundle.js",
  "author": "Jon E. Froehlich",
  "devDependencies": {
    "@babel/core": "^7.25.2",
    "@babel/preset-env": "^7.25.4",
    "babel-loader": "^9.2.1",
    "webpack": "^5.95.0",
    "webpack-cli": "^5.1.4",
    "webpack-dev-server": "^5.1.0"
  },
  "scripts": {
    "build": "webpack",
    "start": "webpack serve --open"
  }
}

The webpack.config.js:

const path = require('path');

module.exports = {
    entry: './src/lib/makelab-index.js', // Adjust this path to your main entry file
    resolve: {
      alias: {
        '@lib': path.resolve(__dirname, 'src/lib'),
        '@graphicslib': path.resolve(__dirname, 'src/lib/graphics'),
        '@mathlib': path.resolve(__dirname, 'src/lib/math'),
        '@apps': path.resolve(__dirname, 'src/apps'),
        '@dist': path.resolve(__dirname, 'dist')
      },
    },
    output: {
        path: path.resolve(__dirname, 'dist'), // Output directory
        filename: 'makelab.bundle.js', // Output file names
        // library: {
        //   name: "makelab",
        //   type: "umd",
        // },
        // globalObject: 'this',
    },
    mode: 'development',
    //mode: 'production',
    module: {
      rules: [
        {
          test: /\.js$/,
          exclude: /node_modules/,
          use: {
            loader: 'babel-loader',
            options: {
              presets: ['@babel/preset-env']
            }
          }
        }
      ]
    },
    devServer: {
      static: [
        {
            directory: path.join(__dirname, 'src/apps'),
            publicPath: '/apps',
        },
        {
            directory: path.join(__dirname, 'dist'),
            publicPath: '/dist',
        }
      ],
      compress: true,
      port: 9000,
      open: true,
      hot: true,
    },
};

Here's the makelab-index.js (very simple for now with just exporting Vector):

window.globalVariable = 'some value';
export { Vector } from '@mathlib/vector.js'; 

A simple test app in /src/apps/math/VectorTests with an index.html and sketch.js:

<!DOCTYPE html>
<html>
<head>
  <title>Vector Test Results</title>
</head>
<body>
  <div id="test-results"></div>
  <script src="/dist/makelab.bundle.js"></script>
  <script type="module" src="sketch.js"></script>
</body>
</html>

And here's the sketch.js:

import { Vector } from '/dist/makelab.bundle.js';

function testVector(testName, expectedResult, actualResult) {
  const result = expectedResult === actualResult;
  console.log(`${testName}: ${result ? 'PASSED' : 'FAILED'}`);
  if (!result) {
    console.log(`  Expected: ${expectedResult}`);
    console.log(`  Actual: ${actualResult}`);
  }
}

// Basic arithmetic tests
testVector('Vector addition', new Vector(3, 4), new Vector(1, 2).add(new Vector(2, 2)));
testVector('Vector subtraction', new Vector(1, 2), new Vector(3, 4).subtract(new Vector(2, 2)));
testVector('Vector multiplication', new Vector(2, 4), new Vector(1, 2).multiply(2));
testVector('Vector division', new Vector(0.5, 1), new Vector(2, 4).divide(4));

After running npm run build, I try to load VectorTests' index.html page in Chrome, I get:

Uncaught SyntaxError: The requested module '/dist/makelab.bundle.js' does not provide an export named 'Vector' (at sketch.js:2:10)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions