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

Browser support #77

Closed
pwichmann opened this issue Mar 30, 2017 · 37 comments
Closed

Browser support #77

pwichmann opened this issue Mar 30, 2017 · 37 comments

Comments

@pwichmann
Copy link

You state...

Fontkit is an advanced font engine for Node and the browser

...but you don't offer an explanation (for the less well-versed among us) how Fontkit can be used for the browser environment. It'd be amazing if you could add a few lines about how one would do that (i.e. without node.js).

I would expect something like a *.js file that I could embed in an HTML file. But it's probably not that easy...

Many thanks! This is a super helpful library.

@imkamil
Copy link

imkamil commented Apr 18, 2017

Can anyone help?

@Pomax
Copy link
Contributor

Pomax commented Apr 18, 2017

You can bundle it for use in the browser using browserify, webpack, or other tools that can take commonjs code as input to produce browser-loadble ES5/ES6 code.

@adamdyson
Copy link

I was just searching to do the same thing, some documentation on this subject would be nice.

@defue
Copy link
Contributor

defue commented May 30, 2017

Anyone managed to produce browser-loadable code? Could someone share instructions on how to do it?
I am trying to browserify it and get the below error:

SyntaxError: 'import' and 'export' may appear only with 'sourceType: module' (1:0) while parsing file: /home/user/fontkit/node_modules/fontkit/src/TTFFont.js

@twardoch
Copy link

https://fontkit-demo.now.sh/
https://github.com/devongovett/fontkit-demo

https://agsek.github.io/monoto-fonts-ofl/
https://github.com/agsek/monoto-fonts-ofl

@defue
Copy link
Contributor

defue commented May 31, 2017

@twardoch, thanks a lot for the links!

@indolering
Copy link

Browsers are finally starting to support ES6 module loading natively. How about an additional rollup config that resolves all of the CommonJS modules and handles misc Babel transforms?

@indolering
Copy link

I just submitted a pull request that adds a build for browsers via Browserify. This is less than ideal: Browserify adds to the size and doesn't support ES6 syntax. I think the "only" major dependency on Node is Buffer and Stream. Browsers have a slightly different implementation of buffers but a subset of the API is shared with Node.

@Pomax
Copy link
Contributor

Pomax commented Sep 21, 2017

@indolering only in webkit/blink for the forseeable future, unfortunately.

@indolering
Copy link

@Pomax The PR request I submitted transpiles to ES5 and UMD.

@bkstorm
Copy link

bkstorm commented Nov 2, 2017

Hey guy, how to use this library without using module loader like requirejs, commonjs, webpack, ....
I mean just native js.

@mirrec
Copy link

mirrec commented Jan 11, 2018

I have extracted code from @twardoch post. Thanks for that!
This load font in the browser. Hope it will help.

const loadBlob = (blob) => {
  blobToBuffer(blob, (err, buffer) => {
    if (err) {
      throw err;
    }

    let font = fontkit.create(buffer)
    console.log(font)
    // do something with font
  })
}

fetch('link-to-your-font.woff').then(res => res.blob()).then(loadBlob, console.error)

@mrdoob
Copy link

mrdoob commented Aug 7, 2018

Indeed... It would be great if you could include standalone js es5/es6 files in the releases section.

@Pomax
Copy link
Contributor

Pomax commented Aug 7, 2018

A small note on today's JS landscape: everything except legacy browsers (which is only a single browser right now; IE11) support ES6 at this point, so an ES5 release wouldn't make a whole lot of sense anymore.

That's more something that people who still need to support legacy browsers can quite easily effect themselves by running their code through a transpiler after bundling, rather than having individual libraries do this beforehand.

@mrdoob
Copy link

mrdoob commented Aug 7, 2018

Sounds good. Standalone ES6 fontkit.module.js file then? 🤔

@moffsugita
Copy link

can't ? it is only server side only??

@moffsugita
Copy link

#41

@moffsugita
Copy link

README says "Fontkit is an advanced font engine for Node and the browser, used by PDFKit. "
but, can't.

code

var fontkit = require('fontkit');
const image = require(`./fonts/fonts/Open_Sans/OpenSans-Regular.ttf`);
fontkit.openSync(image, {
  family: 'Open Sans',
});

Error in browser

TypeError: fs.readFileSync is not a function
(anonymous function)
node_modules/unicode-properties/index.js:6
  3 | UnicodeTrie = require('unicode-trie');
  4 | data = require('./data.json');
  5 | fs = require('fs');
> 6 | trie = new UnicodeTrie(fs.readFileSync(__dirname + '/data.trie'));
  7 | 
  8 | log2 = Math.log2 || function (n) {
  9 |   return Math.log(n) / Math.LN2;
View compiled
./node_modules/unicode-properties/index.js
http://localhost:3000/static/js/1.chunk.js:127338:30

@alimoosavi15
Copy link

README says "Fontkit is an advanced font engine for Node and the browser, used by PDFKit. "
but, can't.

code

var fontkit = require('fontkit');
const image = require(`./fonts/fonts/Open_Sans/OpenSans-Regular.ttf`);
fontkit.openSync(image, {
  family: 'Open Sans',
});

Error in browser

TypeError: fs.readFileSync is not a function
(anonymous function)
node_modules/unicode-properties/index.js:6
  3 | UnicodeTrie = require('unicode-trie');
  4 | data = require('./data.json');
  5 | fs = require('fs');
> 6 | trie = new UnicodeTrie(fs.readFileSync(__dirname + '/data.trie'));
  7 | 
  8 | log2 = Math.log2 || function (n) {
  9 |   return Math.log(n) / Math.LN2;
View compiled
./node_modules/unicode-properties/index.js
http://localhost:3000/static/js/1.chunk.js:127338:30

I'm getting the same error. Did you find the solution?

@mearns
Copy link

mearns commented Feb 5, 2019

I'm trying to bundle this using webpack. I'm not clear on the differences between webpack and browserify, but the issue with webpack seems to be the fs.readFileSync calls, as noted in the previous two comments. I'm curious how browserify is able to handle this, but more to the point, I'm looking for a way to do this with webpack.

mearns added a commit to mearns/fontkit that referenced this issue Feb 5, 2019
This uses the existing trie generation scripts to also generate a JS
module that exports the contents of the trie as a Buffer. This should
allow tools like webpack to successfully package fontkit and allow it to
be required as a module.

Prior to this, webpack could package it fine, but when the generated
bundle executes and tries to import fontkit, it throws an error because
of the load-time fs.readFileSync calls.
@mearns
Copy link

mearns commented Feb 5, 2019

I just put in a PR (#185) to get around the readFileSync issue, which I think will allow this to work in webpack.

@nmassi
Copy link

nmassi commented Jul 14, 2020

README says "Fontkit is an advanced font engine for Node and the browser, used by PDFKit. "
but, can't.

code

var fontkit = require('fontkit');
const image = require(`./fonts/fonts/Open_Sans/OpenSans-Regular.ttf`);
fontkit.openSync(image, {
  family: 'Open Sans',
});

Error in browser

TypeError: fs.readFileSync is not a function
(anonymous function)
node_modules/unicode-properties/index.js:6
  3 | UnicodeTrie = require('unicode-trie');
  4 | data = require('./data.json');
  5 | fs = require('fs');
> 6 | trie = new UnicodeTrie(fs.readFileSync(__dirname + '/data.trie'));
  7 | 
  8 | log2 = Math.log2 || function (n) {
  9 |   return Math.log(n) / Math.LN2;
View compiled
./node_modules/unicode-properties/index.js
http://localhost:3000/static/js/1.chunk.js:127338:30

I think I solved this by importing 'fontkit/base' instead of 'fontkit' but I don't found any documentation about this.

@opcodewriter
Copy link

Can someone please show a simple example how to get a browser build out of the fontkit repo?

It's 2021 (almost) and ES9 is supported in a every modern browser, so many of the concerns related to JS should not be an issue anymore.

@domsson
Copy link

domsson commented Feb 22, 2021

Just scanned through the comments and still not sure how to use this with a plain browser + vanilla JS setup. Any tutorials out there that would guide me through the process step by step?

@bennlich
Copy link

bennlich commented May 23, 2021

Looks like the docs for this project are a little better: https://github.com/opentypejs/opentype.js

But also this comment links to several examples that use fontkit in the browser: #77 (comment)

@tushuhei
Copy link

This fork might be helpful to use on a browser.
https://github.com/Hopding/fontkit

@BaGsn
Copy link

BaGsn commented Oct 7, 2021

This library is the only one (as far as I know) with the ability to read variable font tables from WOFF2 files. I tried to bundle it with browserify but I bumbed into the same issues when I tried to use the result (TypeError: fs.readFileSync is not a function).
It would be great if someone with the knowledge could export a browser build.

@Pomax
Copy link
Contributor

Pomax commented Oct 7, 2021

@BaGsn does the above fork not work for you?

@Pomax
Copy link
Contributor

Pomax commented Oct 7, 2021

@Hopding I noticed your fork doesn't have issues enabled - that does make it a bit harder to recommend new PRs to merge in =)

(and suggest updates that won't ever happen here, as this project is effectively abandoned, near as I can figure. For instance, Node has had native brotli support for quite a while now, voiding the need for brotli.js)

@luke-robertson
Copy link

bumping to 2022

@devongovett
Copy link
Member

Sorry but what is missing at this point? I did a lot of work on this recently. Here's a demo using fontkit in the browser with no build step. Is something else broken for you? https://codepen.io/devongovett/pen/JjpVMKZ

@phil-r
Copy link

phil-r commented Jul 25, 2022

Hey @devongovett! I don't think your link works

@Pomax
Copy link
Contributor

Pomax commented Jul 25, 2022

If esm.sh is the quasi-official CDN for fontkit, it might be good to copy that example into the README.md as browser example so folks won't need to hunt for it.

@devongovett
Copy link
Member

Something must have changed with the way esm.sh works, because it worked when I wrote that codepen and I haven't changed anything. Sigh. I updated the pen to use the bundled mode, which seems to work.

I wouldn't say there's an "official" CDN for fontkit. Really, I'd recommend hosting it yourself, or bundling it into your application. That way you never get weird breakages like the above.

@devongovett
Copy link
Member

Going to close this because I think it is working now. If you have further problems, please open a separate issue for that.

@Typogram
Copy link

Typogram commented Feb 13, 2023

Sorry but what is missing at this point? I did a lot of work on this recently. Here's a demo using fontkit in the browser with no build step. Is something else broken for you? https://codepen.io/devongovett/pen/JjpVMKZ

Your code works, thank you @devongovett!
In your working codepen example, you use:

import * as fontkit from 'https://esm.sh/fontkit?bundle';
/* esm.sh - fontkit@2.0.2 */
export * from "https://esm.sh/v106/fontkit@2.0.2/es2022/fontkit.bundle.js";

But I don't see a fontkit.bundle.js in the build script or dist folder. How can I build fontkit.bundle.js from the source code?

@jamj2000
Copy link

jamj2000 commented Apr 5, 2023

Sorry but what is missing at this point? I did a lot of work on this recently. Here's a demo using fontkit in the browser with no build step. Is something else broken for you? https://codepen.io/devongovett/pen/JjpVMKZ

Your code works, thank you @devongovett! In your working codepen example, you use:

import * as fontkit from 'https://esm.sh/fontkit?bundle';
/* esm.sh - fontkit@2.0.2 */
export * from "https://esm.sh/v106/fontkit@2.0.2/es2022/fontkit.bundle.js";

But I don't see a fontkit.bundle.js in the build script or dist folder. How can I build fontkit.bundle.js from the source code?

Follow de link.

https://esm.sh/v113/fontkit@2.0.2/es2022/fontkit.bundle.mjs

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests