Node running ESM - ReferenceError: exports is not defined

423 Views Asked by At

Really struggling with this. I'm trying to run ESM scripts on Node 14 (AWS Lamda)

I'm trying to run this code to convert 3D objects to THREE JSON.

This requires node -r esm fbx2three.js model.fbx to run.

I think I can do it with this approach I found in this blog

i.e.

Index.ts

import Convert from './runner.js'

Runner.js

require = require("esm")(module);
module.exports = require("./converter.mjs").default;

Converter.mjs

import { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader.js'

export default function convertObj(url){
    const loader = new OBJLoader()
    const json = loader.parse(url).toJSON()
}

I'm now stuck on this error when it compiles

Object.defineProperty(exports, "__esModule", { value: true });

ReferenceError: exports is not defined

From converter.mjs:2:29

Which compiled to

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const OBJLoader_js_1 = require("three/examples/jsm/loaders/OBJLoader.js");
function convertObj(url) {
    const loader = new OBJLoader_js_1.OBJLoader();
    const json = loader.parse(url).toJSON();
}
exports.default = convertObj;

tsconfig

{
  "compilerOptions": {
    "outDir": "./bin",   
    "rootDir": "./src", 
    "lib": ["esnext"],
    "target": "es6",
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "noImplicitAny": false,
    "module": "commonjs",
    "allowJs": true,
    "moduleResolution": "node"
  }
}

Package

{
  "name": "converter",
  "version": "1.0.0",
  "description": "",
  "scripts": {
    "update": "tsc && claudia update  --handler bin/index.handler --timeout 60 --memory 1024",
    "create": "tsc && claudia create --region ap-southeast-2 --handler bin/index.handler",
    "pack": "tsc && claudia pack --api-module bin/index --force",
    "test": "claudia test-lambda --event event.json"
  },
  "main": "bin/index",
  "files": [
    "bin/**/*.*",
    "package.json"
  ],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "esm": "^3.2.25",
    "s3-unzip": "^0.1.13",
    "three": "^0.135.0",
    "typescript": "^4.5.2"
  },
  "devDependencies": {
    "@types/node": "^16.11.11",
    "babel-cli": "^6.26.0",
    "babel-preset-es2015": "^6.24.1",
    "claudia": "^5.14.0"
  }
}
1

There are 1 best solutions below

2
Antonio Gargaro On

Try making both false (or remove),

  • esModuleInterop
  • allowSyntheticDefaultImports