Reducing the deployment size of your JavaScript Azure Functions

January 12, 2020  1 minute read  

I’m doing some Azure Functions development in JavaScript at the moment, using the new azure-functions-core-tools. One of the features it has is command line publication, like this:

$ func azure functionapp publish my-function-app

I have a single function right now (called ping). Running the publish step creates a ZIP file:

$ npx func azure functionapp publish my-function-app               
Getting site publishing info...
Creating archive for current directory...
Uploading 187.62 MB [##---------------------------------------------------------------------]

That’s a big file. Wow! It creates a ZIP file of the whole directory!!!! My function isn’t that big!

Looking at the directories, it’s obvious which ones are the culprit:

$ du -ks */.           
462952  node_modules/.
8       ping/.
4       tools/.
$ du -ks node_modules/*/.
du -ks node_modules/*/. | sort -rn
451588  node_modules/azure-functions-core-tools/.
3600    node_modules/es5-ext/.
3088    node_modules/es-abstract/.
624     node_modules/ext/.
424     node_modules/type/.
412     node_modules/deferred/.
360     node_modules/resolve/.
156     node_modules/npm-run-all/.
128     node_modules/object-inspect/.
104     node_modules/es6-iterator/.
100     node_modules/es6-symbol/.
96      node_modules/object.assign/.
92      node_modules/timers-ext/.
88      node_modules/event-emitter/.
88      node_modules/es-to-primitive/.
80      node_modules/semver/.
# ...

Getting rid of azure-functions-core-tools from the published source would reduce the file size considerably. Fortunately, the tooling provides .funcignore for precisely this problem. Just add node_modules/azure-functions-core-tools to your .funcignore file. Now, the publication looks like this:

$ npx func azure functionapp publish my-function-app
Getting site publishing info...
Creating archive for current directory...
Uploading 1.7 MB [##########################################################################]
Upload completed successfully.

It knocked about 4 minutes from my publication time, and reduced the file size down to under 2MB.

If you use TypeScript, you should also add the node_modules/typescript package to the .funcignore as that is pretty big too.

Of course, this doesn’t mean anything if the functions don’t work at the end of it. I’m happy to report that my ping API works just fine, so the azure-functions-core-tools isn’t required within the publish package. It’s also given me 5-10 minutes back per publication cycle.

Leave a comment