I am working on the second in the series of screencasts for readers of the “Extras” edition of Patterns in Polymer. Try as I might, I cannot get it down to under 12 minutes. I would much prefer that they run ~5 minutes, so tonight I explore alternate approaches to code what I need.
The goal of this screencast is to build a working Polymer element. I am not trying to get all functionality in place in this screencast. Rather, I am trying to get everything in the right place to build the real thing. For the Dart version of the screencast, I can code up the
pubspec.yaml
, web/index.html
, x-pizza.html
, and x_pizza.dart
files in 15 minutes. I could probably get that down to 12 minutes, but I need help if I am going to get to 5-8 minutes.I could speed up certain sections of the video or use some pre-written snippets, but I have a slight preference for keeping it real-time. So that means code generation. I would further prefer to use standard generators rather than hand-writing my own. Fortunately, Polymer.dart has a few built-in.
I start by globally registering Polymer for running scripts:
$ pub global activate polymer Resolving dependencies... (30.5s) ... Activated polymer 0.15.0+1.Not sure what's up with the 30.5 seconds. Hopefully that's just an internet glitch.
Before using any of the generators, I need a project to play about in. I create a temporary directory with a
pubspec.yaml
:$ mkdir tmp $ cd !$ $ echo "name: x_pizza" > pubspec.yamlThere are two bin scripts in Polymer 0.15.0+1:
$ ls ~/.pub-cache/hosted/pub.dartlang.org/polymer-0.15.0+1/bin new_element.dart new_entry.dartI will start by creating a new element, which supports the following command-line options:
$ pub global run polymer:new_element -h pub run polymer:new_element [-o output_dir] [-e super-element] element-name -o, --output-dir Output directory -e, --extends Extends polymer-element or DOM element (e.g., div, span) -h, --[no-]helpSo let's create an
<x-pizza>
element:$ pub global run polymer:new_element -o lib/elements x-pizza Successfully created: /home/chris/tmp/lib/elements/x_pizza.dart /home/chris/tmp/lib/elements/x_pizza.htmlAnd that does exactly what I would expect (and need). The Dart class definition for the element has the boilerplate stuff:
$ cat lib/elements/x_pizza.dart import 'package:polymer/polymer.dart'; /** * A Polymer x-pizza element. */ @CustomTag('x-pizza') class XPizza extends PolymerElement { /// Constructor used to create instance of XPizza. XPizza.created() : super.created() { } // Commented out lifecycle methods here... }That alone will save me 30 seconds of typing. Compound it with the HTML template definition and I am getting closer to what I need:
$ cat lib/elements/x_pizza.html <!-- import polymer-element's definition --> <link rel="import" href="../../../packages/polymer/polymer.html"> <polymer-element name="x-pizza"> <template> <style> :host { display: block; } </style> <!-- Template content here --> </template> <script type="application/dart" src="x_pizza.dart"></script> </polymer-element>It sure would be nice if I could generate some of the
web/index.html
smoke test page. And add the Polymer dependency and transformer to my pubspec.yaml
, which is still just:$ cat pubspec.yaml name: x_pizzaSay, maybe that's what the other generator does:
$ pub global run polymer:new_entry -h pub run polymer:new_entry entry_point_file.htmlWell, that help output leaves a lot to the imagination. Fortunately, it too does exactly what I would expect (and need). Well almost:
$ pub global run polymer:new_entry web/index.html Added web/index.html to /home/chris/tmp/pubspec.yaml Successfully created: /home/chris/tmp/web/index.htmlAs the output indicates, I now have a Polymer transformer pointing to the smoke test page:
$ cat pubspec.yaml name: x_pizza transformers: - polymer: entry_points: - web/index.htmlA nice-to-have would be adding the Polymer dependency to
pubspec.yaml
, but this will already help some (especially since I keep omitting the “s” at the end of “transformers” for some reason). What will help even more is the boilerplate smoke test page at
web/index.html
:$ cat web/index.html <!doctype html> <html> <head> <script src="packages/web_components/dart_support.js"></script> <!-- link rel="import" href="path_to_html_import.html" --> </head> <body> <!-- HTML for body here --> <script type="application/dart">export 'package:polymer/init.dart';</script> </body> </html>I still have to link to the
lib/x_pizza.html
import in there, but that will certainly save some time and typing.All-in-all, I am excited about these Polymer Dart generators. I expect they will go a long way to solving my screencast time-crunch. Best of all, they are built right into the Polymer.dart library. Now I just need to find a way to do this with the JavaScript version of the screencast. It may be time to play with the new Yeoman generators. Tomorrow.
Day #204
No comments:
Post a Comment