-
Notifications
You must be signed in to change notification settings - Fork 17
Description
The problem: broccoli-asset-rev works perfectly for paths which are simple strings but does not match for dynamically generated strings like assets/img/${this.baseSrc}-1280.jpg.
The solution(s): There seems to be quite a few possible approaches to solving this, like addons like Ember CLI IFA which use the postBuild hook to insert a serialized asset map into the html document, or a similar approach @ryanto shared inserting the serialized json into the vendor.js instead.
The issue: Unfortuntately I've been unable to get any of them to work with Prember. Initially, I used ember-cli-ifa as the basis for a solution which would also work with Fastboot—by using dedicated initializers to extract the meta content via document in browser and via JSDOM with Fastboot.
You can see the Fastboot initializer here but unfortunately despite trying to block the rendering with fastboot.deferRendering() the first initial render in Fastboot still seems to miss the fingerprinting.
Rendering with Prember the fastboot.request.host is correct as localhost:7784, but the fastboot.request.protocol seems absent. Worse, it seems like even hardcoding the protocol the initializer is running before the postBuild hook has finished—because the error message relates to the pre-replaced content ie
Unexpected token _ in JSON at position 0
Due to the fact that I'm also using Broccoli Static Site JSON for the CMS and it seems like there is some ongoing work on the integration with Prember I decided that the injecting json into vendor.js approach might be simpler to achieve my aims.
Unfortunately that seems to bring a different set of problems which I think are more due to the synchronisation necessary between addons.
I notice you have done a lot of work on trying to disentangle broccoli-asset-rev from Fasboot but so far I have not been able to order the addons correctly to achieve the goals I want.
I have 3 in-repo-addons
- json-api (which uses
treeForPublichook to merge content) - ember-cli-asset-map (which uses
postBuildto inject the asset map json intovendor.js) - prember-urls-crawler (which generates the urls and uses the
urlsForPremberhook)
My aim is to run them so that ember-cli-asset-map runs before prember-urls-crawler so that the fingerprinted URLs are available in Fastboot/Prember.
So far I haven't been able to find a combination of ordering which results in that. No matter what I use in the package.json ie using
{
"name": "prember-urls-crawler",
"keywords": [
"ember-addon",
"prember-plugin"
],
"ember-addon": {
"after": "ember-cli-asset-map"
}
}If I output a message from the postBuild hook in the ember-cli-asset-map addon it always comes after the output of the Prember generation, like this:
merging via json-api
pre-render / 200 OK
asset map written to vendor.js
Have I missed something or is this a bug with Prember and the way it interacts with other addons?
Many thanks.