Download importmap Resources at Build Time


The default loading source of Importmap-rails is CDN, but public CDN is not stable in China. Another method is to download JavaScript to the vender/javascript directory, but this method requires external JavaScript to be checked into the source code management tool, causing the source code size to increase.

Is there a way to delay the download of JavaScript to build time? I found a method through practice.


Step 1, Modify .gitignore

Add the following content to .gitignore:


This will let git ignore the content downloaded by importmap.

Step 2, use --download

Add the --download parameter when importmap pin, for example:

bin/importmap pin sortablejs --download

This will immediately download the source code of sortablejs, store it in vendor/javascript, and add the following content to config/importmap.rb:

pin "sortablejs" # @1.15.0

This is a normal importmap operation, just no need to submit js to the source code library, and use the content in config/importmap.rb as the configuration.

Step Three, Add rake task

Create a new lib/tasks/importmap.rake file and write the following content:

require "importmap/npm"
require "importmap/packager"

namespace :importmap do
  desc "Download"
  task :download do
    npm =
    packager =
    packages = { |item| item.join("@") }
    imports = packager.import(packages)
    imports.each do |package, url|
      puts %(Pinning "#{package}" to #{packager.vendor_path}/#{package}.js via download from #{url}), url)


When executing bin/rails assets:precompile, it will first execute bin/rails importmap:download, which will download JavaScript according to the content of config/importmap.rb.

Remember to include the step of bin/rails assets:precompile in Dockerfile, even if you don’t use other build tools.

Step Four, Other Configurations

Add bin/rails importmap:download in other scripts, for example, add it in bin/setup:

puts "\n== Importmap download =="

system! "bin/rails importmap:download"

This is convenient for setting up the development environment.


This article implements the download of importmap resources to the build stage by adding a rake task. You can control the distribution of JavaScript files yourself, and don’t need to submit large external JavaScript files to the source code.

This script does not consider JavaScript dependencies is very complicated.