node-html-to-text icon indicating copy to clipboard operation
node-html-to-text copied to clipboard

Named export 'render' not found

Open steveninety opened this issue 2 years ago • 4 comments

Problem

import { render } from "dom-serializer"

The dom-serializer package specifies export default render, so importing { render } does not work.

Occurs where Error on build in a SvelteKit / Vite / ESM project.

Imported in: packages/base/src/generic-formatters.js

Error message

import { render } from "dom-serializer"; ^^^^^^ SyntaxError: Named export 'render' not found. The requested module 'dom-serializer' is a CommonJS module, which may not support all module.exports as named exports. CommonJS modules can always be imported via the default export, for example using:

import pkg from 'dom-serializer'; const { render } = pkg;

Fix

import render from "dom-serializer"

Will open a pull request.

steveninety avatar Nov 05 '23 11:11 steveninety

Hmm. dom-serializer exports render both as named function and default:

exports.render = render;
exports.default = render;
export function render ...
export default render;

Why SvelteKit / Vite can't understand it?

KillyMXI avatar Nov 05 '23 12:11 KillyMXI

The requested module 'dom-serializer' is a CommonJS module

Why? Both html-to-text version 9 and dom-serializer provide both CJS and ESM versions.

KillyMXI avatar Nov 05 '23 12:11 KillyMXI

Yes it's strange. Will patch it for now, but need to look into it further.

steveninety avatar Nov 08 '23 05:11 steveninety

My main guess: Whatever web bundler is used underneath - is not capable enough and falls back to CommonJS for entire dependency subtree once it sees a single CJS package. (There were related issues with Webpack before.)

Proper solutions could be:

  • use a smarter bundler or improve the one that is used;
  • replace or improve remaining CJS-only packages.

In case of html-to-text, there is one remaining - deepmerge. deepmerge situation is not great. I should've just written my own package when I had time, as I did with many other things. There are now

  • a "galaxy brain" alternative, or simply too different to figure out whether I can achieve the same behavior I need;
  • an updated fork that I'm not sure whether I can trust;
  • an idea of more ergonomic package I'm still bearing.

I will choose something when I'm able to resume working on next major version.

KillyMXI avatar Nov 08 '23 11:11 KillyMXI