I shaved 3 minutes off the Patterns in Polymer screencast that deals with the initial Polymer element generation in Dart. I still need to find another 3 minutes, but that is a good start. Good enough that I would to explore doing the same with JavaScript Polymer elements. Since I would like to stick with standard, maintained generators, this means Yeoman.
In all honesty, I have never used Yeoman. I tend to prefer writing initial applications / widgets by hand. I regard code that I maintain directly as too important to trust without hand-writing. If code is a starship, then I side with Sarris that a captain “know every bolt, every weld in his ship.” I might treat the inner workings of bolt creation and welding tools as abstractions that I can delve into later, but I will understand them well enough and know where they reside in my code.
That said, I don't hate code generation. Especially if they save me 3+ minutes in screencasts.
So I start by installing Yeoman:
$ npm install -g yo /home/chris/local/node-v0.10.20/bin/yo -> /home/chris/local/node-v0.10.20/lib/node_modules/yo/cli.js > yo@1.3.0 postinstall /home/chris/local/node-v0.10.20/lib/node_modules/yo > node ./scripts/doctor [Yeoman Doctor] Everything looks alright! yo@1.3.0 /home/chris/local/node-v0.10.20/lib/node_modules/yo ├── ... └── yeoman-generator@0.17.7 (...)Next, I install the Polymer generator for Yeoman:
$ npm install -g generator-polymer ... generator-polymer@0.5.1 /home/chris/local/node-v0.10.20/lib/node_modules/generator-polymer ...With that, I am ready to run the generator in a new (temporary) project:
$ cd ~/tmp $ mkdir x_pizza $ cd !$ $ yo polymer ? Would you like to include core-elements? No ? Would you like to include paper-elements? No ? Would you like to use SASS/SCSS for element styles? No create .gitignore create .gitattributes create .bowerrc create bower.json create .jshintrc create .editorconfig create Gruntfile.js create package.json create app/404.html create app/favicon.ico create app/robots.txt create app/styles/main.css create app/scripts/app.js create app/.htaccess create app/elements/elements.html create app/elements/yo-list/yo-list.html create app/elements/yo-list/yo-list.css create app/elements/yo-greeting/yo-greeting.html create app/elements/yo-greeting/yo-greeting.css create app/index.html create app/test/index.html create app/test/tests.html create app/test/yo-greeting-basic.html create app/test/yo-list-basic.html ...Yikes! That is a lot of infrastructure. I would rather focus on teaching Polymer than Polymer-on-Yeoman in these screencasts. The default page in
app/index.html file and the sample Polymer element that it includes are nice demos, but I have the feeling that I may end up deleting a bunch of this for use in the screencast. On the other hand, it is nice that it creates a useful bower.json and runs bower.json. I will have to consider this.The element generator is pretty clean however:
$ yo polymer:el x-pizza
? Would you like an external CSS file for this element? No
? Would you like to include an import in your elements.html file? No
create app/elements/x-pizza/x-pizza.html
$ cat app/elements/x-pizza/x-pizza.html
<link rel="import" href="../../bower_components/polymer/polymer.html">
<polymer-element name="x-pizza" attributes="">
<template>
<style>
:host {
display: block;
}
</style>
</template>
<script>
(function () {
'use strict';
Polymer({
// define element prototype here
});
})();
</script>
</polymer-element>I might quibble with the Polymer class being inline instead of in a separate script file, but that is close to what I want.But in the end, I think the seed-element generator is closer to what I need for the screencasts. There is less infrastructure, but it still generates a smoke test page and a skeleton for the template:
$ cd ..
$ rm -rf x_pizza
$ mkdir x_pizza
$ cd !$
$ yo polymer:seed
_-----_
| | .--------------------------.
|--(o)--| | Out of the box I include |
`---------´ | the Polymer |
( _´U`_ ) | seed-element. |
/___A___\ '--------------------------'
| ~ |
__'.___.'__
´ ` |° ´ Y `
? What is your GitHub username? eee-c
? What is your element's name: x-pizza
create .gitignore
create .gitattributes
create .bowerrc
create bower.json
create .jshintrc
create .editorconfig
create x-pizza.css
create x-pizza.html
create index.html
create demo.html
create README.md
create test/index.html
create test/x-pizza-basic.html
create test/tests.html
...
This also runs bower install, so I will be ready to start coding right away. The demo.html page that uses the generated <x-pizza> element is welcomingly brief. The generated element, however, is crazy long—it even includes a fireLasers() method.So it does not seem that generating scaffold code in JavaScript is going to be as easy in JavaScript as in Dart. Hopefully I can work with it to keep the running time under 10 minutes. Time will tell.
Day #205
No comments:
Post a Comment