Dependencies
Install node 10.16.0 or 12.11.1 from https://nodejs.org
Getting started with node.js rakudo.js
The easiest way is to install the rakudo package from npm
mkdir tutorial-project # Create a fresh project directory cd tutorial-projectnpm initnpm install --save rakudo./node_modules/.bin/perl6-js -e 'say "Hello World"'
Using a node.js module
cd tutorial-projectnpm install --save chalk
To use node.js modules you need to specify where they should be looked for. use lib 'nodejs#/your/path/to/node/modules' is a good way to do that
use lib 'nodejs#' ~ $*PROGRAM.parent.add('node_modules').absolute;
use chalk:from<node.js>;
say("Hello {chalk.blue("Blue")} World");
Keep in mind that if you load a node.js module during precompilation it gets reloaded at runtime, so it's internal state gets lost.
Interoperability with JS
Passing :lang to eval will execute the passed code as JavaScript.
my $document = EVAL(:lang, 'return document')
You can access attributes of those objects using postcircumfix:<{ }> (you should often use the <> shorcut) You can call methods on the the objects using regular Perl 6 syntax.
$document<body>.appendChild($document.createTextNode('Hello World'));
Primitive JS data types are converted rather then wrapped
JavaScript | Perl6 |
---|---|
true | True |
false | False |
String | Str |
null | Mu |
undefined | Mu |
BigInt | Int |
Number | Num |
A Perl 6 Mu when passed to JS land ends up as null
To pass values to Perl 6 land the executed code needs a return.
EVAL(:lang<JavaScript>, '123') # This returns MuEVAL(:lang<JavaScript>, 'return 123') # This returns 123
Extra methods on wrapped JS objects
In order to enable using wrapped objects in Perl 6 land wrapped objects offer some methods that Perl 6 expects.
-
sink
Does nothing.
-
defined
Always returns True
-
Bool
Always returns True
-
item
Returns the object it is called on
-
new
Uses the JavaScript new operator to create an new instance
my $Date = EVAL(:lang<JavaScript>, 'return Date');my $instance = $Date.new('December 17, 1995 03:24:00');say($instance.getFullYear()); # 1995
If the wrapped object has method of that same name you can use an :INTERNAL modifier to access it.
$obj.new(:INTERNAL, 123)
| -------------|-------|
This will call a js new method rather then doing ``new $obj(123)```