I really like what you have done.

I know you are trying to avoid boiler plate but I'm wondering how technically difficult it would be to provide an alternative for those of us who really like named components? Something like:

  <script>
    ZjsComponent.register("counter-component", "counter.zjsc");
  </script>
Then I can just use in the named way, like:

  <counter-component start-at="100"><counter-component>

As an opt-in, probably not a bad idea. I'll look into it.