# TLDR
# config/importmap.rb
# NOTE: rename `fontawesome.js` to `all.js`
pin "@fortawesome/fontawesome-free",
to: "https://ga.jspm.io/npm:@fortawesome/fontawesome-free@6.1.1/js/all.js"
# app/javascript/application.js
import "@fortawesome/fontawesome-free";
Based on documentation, we need to load js/all.js from fontawesome package to load all icons https://fontawesome.com/docs/web/setup/host-yourself/svg-js#add-font-awesome-files-to-your-project.
You must have javascript_importmap_tags in your layout for this to work.
Pin fontawesome:
$ bin/importmap pin @fortawesome/fontawesome-free
Pinning "@fortawesome/fontawesome-free" to https://ga.jspm.io/npm:@fortawesome/fontawesome-free@6.1.1/js/fontawesome.js
That command doesn't pin the correct file, so we need to change it:
# config/importmap.rb
# NOTE: change `fontawesome.js` to `all.js`
pin "@fortawesome/fontawesome-free",
to: "https://ga.jspm.io/npm:@fortawesome/fontawesome-free@6.1.1/js/all.js"
Import it in application.js:
// app/javascript/application.js
import "@fortawesome/fontawesome-free"; // => https://ga.jspm.io/npm:@fortawesome/fontawesome-free@6.1.1/js/all.js
Everything should work now.
Other options.
Alternatively, import pinned module in the layout instead of application.js:
<%= javascript_import_module_tag "@fortawesome/fontawesome-free" %>
To load only certain styles, we need to load solid.js, brands.js, and fontawesome.js separately.
Pin fontawesome and don't change it:
$ bin/importmap pin @fortawesome/fontawesome-free
Pinning "@fortawesome/fontawesome-free" to https://ga.jspm.io/npm:@fortawesome/fontawesome-free@6.1.1/js/fontawesome.js
Pin solid.js:
$ bin/importmap pin @fortawesome/fontawesome-free/js/solid.js
Pinning "@fortawesome/fontawesome-free/js/solid.js" to https://ga.jspm.io/npm:@fortawesome/fontawesome-free@6.1.1/js/solid.js
Pinned name is a bit verbose, so we could rename it:
pin "@fortawesome/fontawesome-free/solid", to: "https://ga.jspm.io/npm:@fortawesome/fontawesome-free@6.1.1/js/solid.js"
Import it in application.js:
// app/javascript/application.js
import "@fortawesome/fontawesome-free/solid"; // => https://ga.jspm.io/npm:@fortawesome/fontawesome-free@6.1.1/js/solid.js
import "@fortawesome/fontawesome-free"; // => https://ga.jspm.io/npm:@fortawesome/fontawesome-free@6.1.1/js/fontawesome.js
Do the same for brands.js if needed.
You should end up with something like this in your rendered layout:
<script type="importmap" data-turbo-track="reload">{
"imports": {
"application": "/assets/application-66ce7505c61e3e4910ff16e7c220e1fbfb39251cd82e4bab8d325b3aae987cf9.js",
"@fortawesome/fontawesome-free": "https://ga.jspm.io/npm:@fortawesome/fontawesome-free@6.1.1/js/fontawesome.js",
"@fortawesome/fontawesome-free/solid": "https://ga.jspm.io/npm:@fortawesome/fontawesome-free@6.1.1/js/solid.js",
}</script>
<script type="module">import "application"</script>
Skip importmap and just import with full url:
# app/views/layouts/application.html.erb
<%= javascript_import_module_tag "https://ga.jspm.io/npm:@fortawesome/fontawesome-free@6.1.1/js/all.js" %>
or
// app/javascript/application.js
import "https://ga.jspm.io/npm:@fortawesome/fontawesome-free@6.1.1/js/all.js"
Forget javascript_import_module_tag helper, just use a script tag:
<!-- app/views/layouts/application.html.erb -->
<script type="module">import "https://ga.jspm.io/npm:@fortawesome/fontawesome-free@6.1.1/js/all.js"</script>
or
<script type="module" src="https://ga.jspm.io/npm:@fortawesome/fontawesome-free@6.1.1/js/all.js"></script>
type="module" is the important bit.
And all the way back to old js that does the same thing and with async is pretty much equivalent and icons load faster on the page:
<script async="async" src="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.1.1/js/all.min.js"></script>