Ember-cli-ifa
Inject fingerprinted assetMap.json file into your app and provide initializer, service, and helper to
dynamically reference fingerprinted assets.
When to use this addon?
- If you have dynamic asset file names returned from API and/or you build paths based on several properties.
- If you can't put your asset filemames into css or to have path as static in your .js files.
- If you build your image/asset paths in a dynamic way, eg.
imagePath: computed(function() {
return this.get('assetMap').resolve(`${this.get('image')}.png`);
})
Installation
ember install ember-cli-ifa
Configuration
Enable addon in environment.js
for specific environment.
module.exports = function(environment) {
var ENV = {
...
ifa: {
enabled: true,
inline: false,
}
...
};
In case you use s3 and manifest module for ember-cli-deploy, update there configurations in config/deploy.js
.
module.exports = function(environment) {
var ENV = {
...
s3: {
filePattern: '**/*.{js,css,png,gif,ico,jpg,map,xml,txt,svg,swf,eot,ttf,woff,woff2,otf,json}',
...
},
manifest: {
filePattern: "**/*.{js,css,png,gif,ico,jpg,map,xml,txt,svg,swf,eot,ttf,woff,woff2,json}"
...
}
...
};
Configure fingerprinting in ember-cli-build.js
. Refer to the documentation of ember-cli for asset-compilation
fingerprint: {
enabled: true,
generateAssetMap: true,
fingerprintAssetMap: true
}
Usage
asset-map helper
If name
is tomster-under-construction
:
<img src={{asset-map (concat "assets/" name ".png")}} />
then it will generate something like assets/tomster-under-construction-da524c8bc9283f759ae640b68db81f24.png
base on assetMap.json.
asset-map service
import Component from 'ember-component';
import service from 'ember-service/inject';
export default Component.extend({
assetMap: service('asset-map'),
key: null,
image: computed('key', function() {
return this.get('assetMap').resolve(`assets/${this.get('key')}.png`);
})
});
Storing assets in a sub-directory
If prepend
option is added in fingerprint configuration block, it will be prepended into
generated asset path in the index.html.
var app = new EmberApp(defaults, {
fingerprint: {
prepend: '/blog/'
}
});
/blog
will be prepended to the assetMap file path in the index.html.
inline option
If inline: true
is specified in config, contents of assetMap file will be inline into index.html.
<script>
...
var __assetMapPlaceholder__ = {
"assets": {
"assets/assetMap.json": "assets/assetMap-0a0447ba419421fa257963a718324fa8.json",
"assets/failed.png": "assets/failed-836936cf32381ff14d191d7b10be9a89.png",
"assets/passed.png": "assets/passed-b8506cbc195c8b9db541745aee267c48.png",
"assets/tomster-under-construction.png": "assets/tomster-under-construction-da524c8bc9283f759ae640b68db81f24.png"
},
"prepend": ""
};
</script>
...
This might save one request to assetMap.json, but will increase overall size of index.html
file, so use carefully.