chenos/execjs

此包的最新版本(v0.1.0)没有可用的许可证信息。

v0.1.0 2018-02-05 03:53 UTC

This package is not auto-updated.

Last update: 2024-09-29 05:27:42 UTC


README

Build Status Coverage Status

需求

  • PHP 7.0+
  • V8Js 扩展 2.0+

安装

composer require chenos/execjs

测试

make test

示例

make example

访问 http://127.0.0.1:9999

使用方法

use Chenos\ExecJs\Context;
use Chenos\V8JsModuleLoader\ModuleLoader;

$context = new Context('PHP');

$context->getLoader()
    ->setEntryDir(__DIR__)
    ->addVendorDir(__DIR__.'/node_modules')
    ->addOverride('vue', 'vue/dist/vue.runtime.common.js')
    ;
// or
$loader = new ModuleLoader();
$loader->setEntryDir(__DIR__)
    ->addVendorDir(__DIR__.'/node_modules')
    ->addOverride('vue', 'vue/dist/vue.runtime.common.js')
    ;
$context->setLoader($loader);

$context->eval(string $script);
$context->load(string $module);
$context->require($module, string|array $identifier);
$context->set(string $key, mixed $value, $global = false);

API

eval

评估表示为字符串的JavaScript代码。

public mixed function eval(string $script, int $flags = V8Js::FLAG_NONE, int $timeLimit = 0, int $memoryLimit = 0)

几乎与V8Js::executeString相同,除了$identifier参数。

public mixed function V8Js::executeString(string $script, string $identifier = '', int $flags = V8Js::FLAG_NONE, int $timeLimit = 0, int $memoryLimit = 0)

使用方法

$context->eval('1+1'); // 2

load

评估从文件表示的JavaScript代码。

public mixed function load(string $module, int $flags = V8Js::FLAG_NONE, int $timeLimit = 0, int $memoryLimit = 0)
$context->load('./foo.js');
// equals
$str = $context->getLoader()->loadModule('./foo.js');
$context->eval($str);

require

支持CommonJS模块以require外部代码。

public mixed function require(string $module, string|array $identifier = null)

使用方法

$yaml = $context->require('js-yaml');
$yaml->load('a: b'); // ['a' => 'b']

字符串标识符

$yaml = $context->require('js-yaml', 'jsyaml');
// equals
$context->eval("var jsyaml = require('js-yaml'); jsyaml;");

// usage
$yaml->load('a: b'); // ['a' => 'b']
$context->eval(sprintf('jsyaml.dump(%s)', json_encode(['a' => 'b']))); // 'a: b'

数组标识符

$context->require('js-yaml', ['load', 'dump']);
// equals
$context->eval("var {load, dump} = require('js-yaml').load;");

$context->eval("load('a: b')"); // ['a' => 'b']
$context->eval(sprintf('dump(%s)', json_encode(['a' => 'b']))); // 'a: b'

$context->require('js-yaml', ['load' => 'yamlLoad']);
// equals
$context->eval("var yamlLoad = require('js-yaml').load;");
// es6: import {load as yamlLoad} from 'js-yaml'

$context->eval("yamlLoad('a: b')"); // ['a' => 'b']

set

分配属性以便使其可访问javascript上下文。

public Context function set(string $key, mixed $value, $global = false)

使用方法

$context->set('foo', 'bar');
$context->eval('PHP.foo'); // bar
$context->eval('foo'); // error undefined

$context->set('bar', 'baz', true);
$context->eval('PHP.bar'); // baz
$context->eval('bar'); // baz

$context->set('process', [
    'env' => [
        'NODE_ENV' => 'production',
    ],
], true);

$context->eval('process.env.NODE_ENV'); // production

全局变量

  • exit V8Function
  • PHP V8Js
  • print V8Function
  • require V8Function
  • sleep V8Function
  • var_dump V8Function