Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

documentation to show ESM import and usage #1692

Closed
henriquez opened this issue May 31, 2020 · 15 comments
Closed

documentation to show ESM import and usage #1692

henriquez opened this issue May 31, 2020 · 15 comments
Labels
category: docs Documentation changes good first issue Something easy to get started with

Comments

@henriquez
Copy link

henriquez commented May 31, 2020

Describe the bug
I'm using rollup to bundle dependencies (for a Svelte framework web app) but having trouble importing and using markedjs. It appears the library was recently ported to ESM modules, but I don't see any documentation on how to use as such. The standard syntax to import ES6 modules give me errors:

import { marked } from 'marked.esm';
returns
(!) Unresolved dependencies
https://rollupjs.org/guide/en/#warning-treating-module-as-external-dependency
marked.esm (imported by src/parser/parser.js)
(!) Missing global variable name
Use output.globals to specify browser global variable names corresponding to external modules
marked.esm (guessing 'marked')

and

import { marked } from 'marked';
returns
bundles src/main.js → public/build/bundle.js...
(!) this has been rewritten to undefined
https://rollupjs.org/guide/en/#error-this-is-undefined
node_modules/marked/lib/marked.js
14: typeof define === 'function' && define.amd ? define(factory) :
15: (global = global || self, global.marked = factory());
16: }(this, (function () { 'use strict';
^
17:
18: function _defineProperties(target, props) {
[!] Error: 'marked' is not exported by node_modules/marked/lib/marked.js, imported by src/parser/parser.js
https://rollupjs.org/guide/en/#error-name-is-not-exported-by-module
src/parser/parser.js (11:9)

To Reproduce
npm install marked

in a Svelte js file that's bundled by rollup:
import { marked } from 'marked'; // or similar variations

Expected behavior
no import errors

@KilianKilmister
Copy link

marked.esm is using a default export instead of a named export. so the proper syntax would be:

import marked from 'marked' // note that this is a definition, so you can give it any name you want

But i think you are raising an important point: Why was a default export chosen over a named export? It removes many of the advantages of using esm. As the result is still just some convoluted mess of properties.

It would be much more userfriendly with well organized named exports as they work excellently with TS-language-features.

I'll file a seperate issue about that in a bit

@henriquez
Copy link
Author

I tried that syntax as well, but errors with "'default' is not exported by node_modules/marked/lib/marked.js" detail below:

bundles src/main.js → public/build/bundle.js... (!) thishas been rewritten toundefined https://rollupjs.org/guide/en/#error-this-is-undefined node_modules/marked/lib/marked.js 14: typeof define === 'function' && define.amd ? define(factory) : 15: (global = global || self, global.marked = factory()); 16: }(this, (function () { 'use strict'; ^ 17: 18: function _defineProperties(target, props) { [!] Error: 'default' is not exported by node_modules/marked/lib/marked.js, imported by src/parser/parser.js https://rollupjs.org/guide/en/#error-name-is-not-exported-by-module src/parser/parser.js (10:7) 8: 9: /*************** Imports *****************/ 10: import marked from 'marked';'

Looking at lib/marked.esm.js#L2356 it exports default, but if I try
import marked from 'marked_esm';
that errors with
(!) Unresolved dependencies https://rollupjs.org/guide/en/#warning-treating-module-as-external-dependency marked_esm (imported by src/parser/parser.js) (!) Missing global variable name Use output.globals to specify browser global variable names corresponding to external modules marked_esm (guessing 'marked')
and in my js I get

Uncaught ReferenceError: marked is not defined

with
marked.lexer('# heading');

@UziTech UziTech added the category: docs Documentation changes label Jun 1, 2020
@UziTech
Copy link
Member

UziTech commented Jun 1, 2020

have you tried import marked from "marked/lib/marked.esm.js";?

@henriquez
Copy link
Author

henriquez commented Jun 7, 2020 via email

@UziTech
Copy link
Member

UziTech commented Jun 7, 2020

I don't usually use esm since it is still experimental in node. If anyone wants to create a PR I would be happy to review it.

@evanplaice
Copy link

Here's the usage

import Marked from '../node_modules/marked/lib/marked.esm.js'

Marked(rawMarkdown)

I'm using it in the <wc-markdown> web component

@UziTech UziTech added the good first issue Something easy to get started with label Jul 8, 2020
@KilianKilmister
Copy link

KilianKilmister commented Jul 9, 2020

cjs-require/esm-import can be automatically handled by specifying an "exports" field in the package.json.
This way node will load the appropriate files without the user having to worry about in-module paths.

Short explanation

{
  "exports": {
    [exportPath]: {
      "import": "./path/to/file.mjs",
      "require": "./path/to/file.cjs"
    }
  }
}

So for marked it would be:

{
  "exports": {
    ".": {
      "import": "./lib/marked.esm.mjs", // `.mjs`-extention is needed
      "require": "./src/marked.js"
    }
  }
}

I'll file a PR for that shortly

KilianKilmister pushed a commit to KilianKilmister/marked that referenced this issue Jul 9, 2020
Signed-off-by: kilian <kilian@catsoft.com>
@hatboysam
Copy link

Ran into this issue today building my site with Vue 2 and the Vue CLI. Been developing locally for months and using marked heavily, in my Vue component I had:

import marked from "marked";

When I deployed to production this exploded, marked was not available. Had to replace it with:

const marked = require("marked");

Took me a while to figure this out.

@UziTech
Copy link
Member

UziTech commented Jan 3, 2021

I just tried it and it works to import in node v14

// index.js
import marked from "marked";
console.log(marked("# test"));
// <h1 id="test">test</h1>

It might be different if you are using a bundler.

@jamesb93
Copy link

I think this is related but in SvelteKit next.89 I now get errors when importing marked that I didn't get before and is a complex problem in consideration of SSR.

    import marked from 'marked';

results in:

[vite] Error when evaluating SSR module /node_modules/.pnpm/marked@2.0.3/node_modules/marked/src/marked.js:
ReferenceError: require is not defined
    at /node_modules/.pnpm/marked@2.0.3/node_modules/marked/src/marked.js:1:15
    at instantiateModule (/Users/james/dev/webdev/phd-kit/node_modules/.pnpm/vite@2.2.3/node_modules/vite/dist/node/chunks/dep-994e0558.js:69063:166)
Line must be greater than or equal to 1, got -1
TypeError: Line must be greater than or equal to 1, got -1
    at BasicSourceMapConsumer.SourceMapConsumer_findMapping [as _findMapping] (/Users/james/dev/webdev/phd-kit/node_modules/.pnpm/vite@2.2.3/node_modules/vite/dist/node/chunks/dep-994e0558.js:67940:13)
    at BasicSourceMapConsumer.SourceMapConsumer_originalPositionFor [as originalPositionFor] (/Users/james/dev/webdev/phd-kit/node_modules/.pnpm/vite@2.2.3/node_modules/vite/dist/node/chunks/dep-994e0558.js:68009:22)
    at /Users/james/dev/webdev/phd-kit/node_modules/.pnpm/vite@2.2.3/node_modules/vite/dist/node/chunks/dep-994e0558.js:68969:34
    at String.replace (<anonymous>)
    at /Users/james/dev/webdev/phd-kit/node_modules/.pnpm/vite@2.2.3/node_modules/vite/dist/node/chunks/dep-994e0558.js:68959:21
    at Array.map (<anonymous>)
    at ssrRewriteStacktrace (/Users/james/dev/webdev/phd-kit/node_modules/.pnpm/vite@2.2.3/node_modules/vite/dist/node/chunks/dep-994e0558.js:68958:10)
    at Object.ssrFixStacktrace (/Users/james/dev/webdev/phd-kit/node_modules/.pnpm/vite@2.2.3/node_modules/vite/dist/node/chunks/dep-994e0558.js:69215:27)
    at Object.handle_error (file:///Users/james/dev/webdev/phd-kit/node_modules/.pnpm/@sveltejs+kit@1.0.0-next.89_svelte@3.37.0+vite@2.2.3/node_modules/@sveltejs/kit/dist/chunks/index.js:3317:19)
    at respond$1 (file:///Users/james/dev/webdev/phd-kit/node_modules/.pnpm/@sveltejs+kit@1.0.0-next.89_svelte@3.37.0+vite@2.2.3/node_modules/@sveltejs/kit/dist/ssr.js:956:11)

This problem does not happen if I navigate to the page which uses marked from another page. If I go there directly the problem is 100% reproducible.

@UziTech
Copy link
Member

UziTech commented Nov 10, 2021

This wsa fixed in #2227

@UziTech UziTech closed this as completed Nov 10, 2021
@stolinski
Copy link

stolinski commented Nov 21, 2021

I'm still seeing some weirdness here on the latest. (4.0.4)
Screen Shot 2021-11-21 at 10 52 32 AM

Code compile fine, works in browser, VSCode shows this.

This is a repo/file in question https://github.com/leveluptuts/auto-form/blob/main/src/lib/Markdown.svelte

@UziTech
Copy link
Member

UziTech commented Nov 21, 2021

@stolinski it doesn't look like you have @types/marked installed in that repo.

My guess is without the actual types Typescript is assuming it is a cjs module because main points to a .cjs file.

@GhislainMitahi
Copy link

GhislainMitahi commented Feb 9, 2022

Hi you all, i need to import ans use marked in my react project, so when i compile this is the message it gives me, some one can help me please :

export 'default' (imported as 'Marked') was not found in 'marked' (possible exports: Lexer, Parser, Renderer, Slugger, TextRenderer, Tokenizer, defaults, getDefaults, lexer, marked, options, parse, parseInline, parser, setOptions, use, walkTokens)

@UziTech
Copy link
Member

UziTech commented Feb 9, 2022

Use import { marked } from 'marked' like the error says marked doesn't have a default export.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
category: docs Documentation changes good first issue Something easy to get started with
Projects
None yet
Development

No branches or pull requests

8 participants