Git Product home page Git Product logo

Comments (4)

stefcameron avatar stefcameron commented on September 23, 2024

@khamiltonuk Thanks for filing this issue! It ended-up being brought-up over on focus-trap/focus-trap#173 and we had a discussion there.

Bringing that over to here now:


Webpack can be configured to work around this. The issue is you're wanting to use ESM as a modern module system, but still expecting to have old browser-compatible code inside those modules, and not wanting to transpile any third-party modules. Is that correct (just trying to understand the needs)?

It feels strange to have diverging targets in the same bundle: ES modules (which is technically ES6) and ES5 JS. But I admit I see the same issue in my bundles that reference focus-trap if I set my Babel target to ie: "11" (I end-up with the same issue with the arrow function @khamiltonuk pointed out earlier).

Looks like this is a problem for a lot of libraries, and Webpack is keeping its position on prioritizing module over main for 3 years now: webpack/webpack#5756 (still open)

A lot of packages seem to have solved this by adding a browser entry to their package.json (because Webpack's default order is mainFields: ['browser', 'module', 'main']), which is something we could do with focus-trap and tabbable.

Apparently, this is the browser field spec, but it doesn't really get into specifics about the nature of the referenced files.

Still, given its name "browser", it feels like it should point to the UMD build.

Thoughts?


👉 I just tried this locally with tabbable's package.json having "browser: dist/index.umd.js" (with Webpack) and the resulting bundle that includes tabbable look nice. Webpack took the right UMD "path" for CJS and plopped the result right into the bundle:

}, function(module, exports, __webpack_require__) {
  !function(exports) {
    "use strict";
    var candidateSelectors = [ "input", "select", "textarea", "a[href]", "button", "[tabindex]", "audio[controls]", "video[controls]", '[contenteditable]:not([contenteditable="false"])', "details>summary" ], candidateSelector = candidateSelectors.join(","), matches = "undefined" == typeof Element ? function() {} : Element.prototype.matches || Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;
    function tabbable(el, options) {
      var regularTabbables = [], orderedTabbables = [];
      return getCandidates(el, (options = options || {}).includeContainer, isNodeMatchingSelectorTabbable).forEach((function(candidate, i) {
        var candidateTabindex = getTabindex(candidate);
        0 === candidateTabindex ? regularTabbables.push(candidate) : orderedTabbables.push({
          documentOrder: i,
          tabIndex: candidateTabindex,
          node: candidate
        });
      })), orderedTabbables.sort(sortOrderedTabbables).map((function(a) {           // <- NO ARROW!
        return a.node;
      })).concat(regularTabbables);
    }

    ...

    exports.focusable = focusable, exports.isFocusable = isFocusable, exports.isTabbable = isTabbable, 
    exports.tabbable = tabbable, Object.defineProperty(exports, "__esModule", {
      value: !0
    });
  }(exports);

Based on this, I believe the correct solution here is not to transpile ESM into ES5 while still keeping import/export statements that are part of the language syntax of ES6 (diverging targets for the same build), but rather to simply add the browser: ./dist/index.umd.js entry to package.json.

from tabbable.

stefcameron avatar stefcameron commented on September 23, 2024

@all-contributors add @khamiltonuk for bug

from tabbable.

allcontributors avatar allcontributors commented on September 23, 2024

@stefcameron

I've put up a pull request to add @khamiltonuk! 🎉

from tabbable.

stefcameron avatar stefcameron commented on September 23, 2024

OK, folks, this is hopefully finally fixed in [email protected]. Please LMK if there's still an issue, and my apologies for the hiccup!

from tabbable.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.