Чтобы прояснить вопрос немного: код Protovis пишется с использованием специального тега,
<script type="text/javascript+protovis">
после включения библиотеки Protovis. Однако этот код должен быть встроен в HTML. Браузер не распознает тип text/javascript+protovis
, поэтому он просто игнорирует тег; Protovis находит его и читает текст, содержащийся в теге, не пытаясь загрузить файл, связанный с src
.
Почему Protovis делает это? Поскольку он выполняет синтаксический анализатор на основе регулярных выражений через код для преобразования кода JavaScript 1.8 в код JavaScript 1.6; таким образом, вы можете использовать самые современные функции JavaScript, и ваш код все равно будет работать в старых браузерах. Очень круто.
Хотя вы, конечно, могли бы написать код CoffeeScript, скомпилировать его, а затем вставить его, это сделало бы процесс утомительного построения очень утомительным. Хорошей новостью является то, что маловероятно (невозможно?), Что вы получите код из компилятора CoffeeScript, который использует что-то помимо функций JS 1.6; большинство из этих функций в той или иной форме встроены в сам CoffeeScript. Например, массивы и сокращенный синтаксис для анонимных функций. Это означает, что вы можете просто использовать
<script type="text/javascript" src="myProtovisCode.js"></script>
для вашего скомпилированного кода CoffeeScript (или text/coffeescript
с библиотекой coffee-script.js
, для разработки).
Настоящая хитрость заключается в переводе примеров Protovis с их незнакомым синтаксисом JS 1.8 в CoffeeScript. Например,
cell.add(pv.Dot)
.def("x", function(k0, k1) pv.Scale.linear(flowers, function(d) d[k0]).range(0, s))
.def("y", function(k0, k1) pv.Scale.linear(flowers, function(d) d[k1]).range(0, s))
использует сокращенный синтаксис анонимной функции JS 1.8, где function(x) x * x
является сокращением для function(x) { return x * x; }
. Конечно, это легко переводится на CoffeeScript:
cell.add(pv.Dot)
.def("x", (k0, k1) -> pv.Scale.linear(flowers, (d) -> d[k0]).range(0, s))
.def("y", (k0, k1) -> pv.Scale.linear(flowers, (d) -> d[k1]).range(0, s))
Для получения дополнительной информации ознакомьтесь с Новое в JavaScript 1.8 в документации Mozilla (Firefox - единственный браузер, который в настоящее время изначально поддерживает JS 1.8).