簡體   English   中英

在 JavaScriptCore 中獲取默認導出

[英]Get Default Export in JavaScriptCore

目標:我正在嘗試在 JavaScriptCore 中運行 JSLint。

舊版

較早的 JSLint 版本公開了一個名為JSLINT的全局函數,如下所示:

var JSLINT = (function () {
    ...
}

這很容易在 JavaScriptCore 中檢索和執行:

// Assume 'ctx' is a JSGlobalContextRef
// Assume we have already called JSEvaluateScript()

JSStringRef jsFunctionName = JSStringCreateWithUTF8CString("JSLINT");
JSValueRef jsLintFunctionValue = JSObjectGetProperty(ctx, JSContextGetGlobalObject(ctx), jsFunctionName, NULL);
JSStringRelease(jsFunctionName);
    
JSObjectRef jsLintFunction = JSValueToObject(ctx, jsLintFunctionValue, &exception);

有了這個參考,我就可以使用JSObjectCallAsFunction()來執行該函數。 完美地工作。

新版本

現在,JSLint 已經轉向了這個:

export default Object.freeze(function jslint(
    source = "",
    option_object = empty(),
    global_array = []
) { 
    ... 
});

JavaScriptCore 的文檔很差。 我嘗試了很多東西,但顯然缺少一些明顯的東西。 我現在如何檢索和執行jslint函數?

將 jslint 作為 es-module 導入的說明在這里

/*jslint devel*/
import jslint from "./jslint.mjs";
let code = "console.log('hello world');\n";
let result = jslint(code);
result.warnings.forEach(function ({
    formatted_message
}) {
    console.error(formatted_message);
});

// stderr
// 1 Undeclared 'console'. // line 1, column 1
// console.log('hello world');
// 2 Use double quotes, not single quotes. // line 1, column 13
// console.log('hello world');

快速版

如果@kaizhu 的回答沒有讓你想要你想要的,另一種接近你以前的狀態的選擇是......

  1. 注釋掉從這一行開始的兩行導出代碼。
  2. 參考小寫jslint

這是您需要用今天的 JSLint 版本注釋掉的兩行。

// export default Object.freeze(jslint_export);
// jslint_import_meta_url = import.meta.url;

如果您在項目中包含現在編輯的文件,則jslint函數在您的全局范圍內。

console.log(JSON.stringify(jslint("var a = 5").warnings, null, "  "))

結果:

[
  {
    "a": ";",
    "b": "(end)",
    "code": "expected_a_b",
    "column": 9,
    "line": 1,
    "line_source": "var a = 5",
    "name": "JSLintError",
    "message": "Expected ';' and instead saw '(end)'.",
    "formatted_message": " 1. \u001b[31mExpected ';' and instead saw '(end)'.\u001b[39m \u001b[90m// line 1, column 9\u001b[39m\n    var a = 5"
  }
]

我認為您對代碼所做的唯一更改是小寫jslint

JSStringRef jsFunctionName = JSStringCreateWithUTF8CString("jslint");

改進?

請注意,使用jslint_export可能“更正確”,它是jslint的凍結副本。

JSStringRef jsFunctionName = JSStringCreateWithUTF8CString("jslint_export");

如果你真的想,你可以更換jslint_export可變JSLINT ,並在所有不改變你的JavaScriptCore的代碼。

// let jslint_export;              // The jslint object to be exported.
let JSLINT;                        // The jslint object to be exported.

// lots of stuff skipped

// jslint_export = Object.freeze(Object.assign(jslint, {
JSLINT = Object.freeze(Object.assign(jslint, {
    cli: Object.freeze(jslint_cli),
    edition: jslint_edition,
    jslint: Object.freeze(jslint.bind(undefined))
}));

我必須再次檢查舊代碼以查看其行為是否相同,但請注意,實際的 linting 函數將在該構造中的JSLINT.jslint上。

但是,我不確定當前版本的 JSLint 中為什么會有如此多的全局范圍污染。 為什么這並不都存在於IIFE 中是令人困惑的; 我覺得以前是? 無論如何,這應該可以解決您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM