本地导入DeepL API报错:Cannot use import statement outside a module
解决浏览器控制台中使用DeepL API的模块导入错误
错误原因
你遇到的Uncaught SyntaxError: Cannot use import statement outside a module错误本质有两个核心原因:
- 浏览器控制台的执行环境不属于ES模块上下文,直接使用
import语法会触发语法错误; deepl-node是Node.js专属的SDK,它依赖Node.js的内置模块(如http、https),浏览器环境没有这些模块支持,就算解决了导入问题也无法正常运行。
解决方案
根据你的需求,提供两种可行的解决路径:
路径一:浏览器控制台直接调用DeepL REST API(无需Node.js包)
放弃deepl-node,直接用浏览器原生的fetch调用DeepL官方REST接口,无需处理模块问题,直接在控制台执行即可。
修改后的核心代码示例:
const DEEPL_API_AUTH_KEY = "你的API密钥"; const DEFAULT_POINTS = 2; const qAndA = []; // 封装翻译函数 async function translateText(text, sourceLang, targetLang) { const response = await fetch("https://api-free.deepl.com/v2/translate", { method: "POST", headers: { "Authorization": `DeepL-Auth-Key ${DEEPL_API_AUTH_KEY}`, "Content-Type": "application/x-www-form-urlencoded" }, body: new URLSearchParams({ text: text, source_lang: sourceLang, target_lang: targetLang, split_sentences: "nonewlines", preserve_formatting: "1" }) }); const data = await response.json(); return data.translations[0].text; } // 提取题目、翻译并生成GAS代码 (async function() { let questionId = 0; for (const e of document.querySelectorAll("h3")) { const translatedTitle = await translateText(e.innerHTML, "EN", "DE"); qAndA.push([ `\n\n// QUESTION ${questionId}`, `question${questionId} = form.addMultipleChoiceItem();`, `question${questionId}.setTitle("${translatedTitle}");`, `question${questionId}.setChoices([` ].join("\n")); // 提取并翻译选项 const options = e.nextElementSibling.querySelectorAll("li"); for (const [idx, opt] of Array.from(options).entries()) { const translatedOpt = await translateText(opt.textContent.trim(), "EN", "DE"); qAndA[questionId] += `\n question${questionId}.createChoice("${translatedOpt}")${idx === options.length - 1 ? "" : ","}`; } qAndA[questionId] += "\n]);"; questionId++; } const gasCode = qAndA.join(""); console.log(gasCode); })();
注意:若使用付费版DeepL API,需将请求地址改为https://api.deepl.com/v2/translate。
路径二:改为Node.js脚本(适合批量处理)
既然已安装Node.js和deepl-node,可以将整个逻辑改为Node脚本,用cheerio解析本地HTML文件,更适合批量处理大量题目。
步骤如下:
- 安装依赖:
npm install deepl-node cheerio fs-extra
- 创建脚本文件(如
generate-gas.js):
import * as deepl from "deepl-node"; import cheerio from "cheerio"; import fs from "fs-extra"; const DEEPL_API_AUTH_KEY = "你的API密钥"; const translator = new deepl.Translator(DEEPL_API_AUTH_KEY); const DEFAULT_POINTS = 2; async function main() { // 读取本地HTML文件 const htmlContent = await fs.readFile("./本地HTML文件路径.html", "utf8"); const $ = cheerio.load(htmlContent); const qAndA = []; let questionId = 0; for (const e of $("h3")) { const originalTitle = $(e).html(); const translatedTitle = (await translator.translateText(originalTitle, "en", "de", { splitSentences: "nonewlines", preserveFormatting: true, })).text; qAndA.push([ `\n\n// QUESTION ${questionId}`, `question${questionId} = form.addMultipleChoiceItem();`, `question${questionId}.setTitle("${translatedTitle}");`, `question${questionId}.setChoices([` ].join("\n")); // 提取并翻译选项 const options = $(e).next("ul").find("li"); for (const [idx, opt] of Array.from(options).entries()) { const originalOpt = $(opt).text().trim(); const translatedOpt = (await translator.translateText(originalOpt, "en", "de")).text; qAndA[questionId] += `\n question${questionId}.createChoice("${translatedOpt}")${idx === options.length - 1 ? "" : ","}`; } qAndA[questionId] += "\n]);"; questionId++; } const gasCode = qAndA.join(""); console.log(gasCode); // 可选:将结果写入本地文件 await fs.writeFile("./gas-code-output.js", gasCode); } main().catch(err => console.error(err));
- 运行脚本:
node generate-gas.js
总结
如果只是临时处理少量题目,路径一的浏览器控制台方案最快捷;如果需要批量处理大量题目,路径二的Node.js脚本更稳定,也能规避浏览器环境的各种限制。
内容的提问来源于stack exchange,提问作者yoshis_eGG
相关产品推荐
相关产品推荐

