rel*_*pec 3 node.js hunspell ecmascript-6
在提出实际问题(见最后)之前,请让我通过示例展示导致该问题的步骤:
\ntests$ mkdir esm && cd esm\ntests/esm$ nvm -v\n0.37.2\ntests/esm$ nvm use v15\nNow using node v15.6.0 (npm v7.5.6)\ntests/esm$ node -v\nv15.6.0\ntests/esm$ npm -v\n7.5.6\ntests/esm$ npm init\npackage name: (esm) test-esm\nentry point: (index.js)\nRun Code Online (Sandbox Code Playgroud)\n安装nodehun
\ntests/esm$ npm install nodehun\nadded 2 packages, and audited 3 packages in 11s\ntests/esm$ npm ls\ntest-esm@1.0.0 tests/esm\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 nodehun@3.0.2\nRun Code Online (Sandbox Code Playgroud)\nindex.js
tests$ mkdir esm && cd esm\ntests/esm$ nvm -v\n0.37.2\ntests/esm$ nvm use v15\nNow using node v15.6.0 (npm v7.5.6)\ntests/esm$ node -v\nv15.6.0\ntests/esm$ npm -v\n7.5.6\ntests/esm$ npm init\npackage name: (esm) test-esm\nentry point: (index.js)\nRun Code Online (Sandbox Code Playgroud)\nchecker.js
tests/esm$ npm install nodehun\nadded 2 packages, and audited 3 packages in 11s\ntests/esm$ npm ls\ntest-esm@1.0.0 tests/esm\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 nodehun@3.0.2\nRun Code Online (Sandbox Code Playgroud)\n要获取所需的Hunspell 词典文件(affix 和dictionary):
tests/esm$ mkdir dictionaries && cd dictionaries\ntests/esm/dictionaries$ curl https://www.softmaker.net/down/hunspell/softmaker-hunspell-english-nz-101.sox > en_NZ.sox\ntests/esm/dictionaries$ unzip en_NZ.sox en_NZ.aff en_NZ.dic\nRun Code Online (Sandbox Code Playgroud)\n根据nodejs文档(确定模块系统)支持import/ export:
\n\n当作为初始输入传递给Node.js 或由ES 模块代码中的语句引用时, Node.js 会将以下内容视为ES 模块:\n\xe2\x80\xa2当最近的父文件包含顶级"时以 结尾的文件类型”字段,值为.
\nnodeimport.jspackage.json"module"
我们在项目的文件中添加"type": "module"字段。package.json
package.json
import { suggest } from \'./checker.js\'\nsuggest("misspeling");\nRun Code Online (Sandbox Code Playgroud)\n第一次运行失败
\nimport Nodehun from \'nodehun\'\nimport fs from \'fs\';\n\nconst affix = fs.readFileSync(\'dictionaries/en_NZ.aff\')\nconst dictionary = fs.readFileSync(\'dictionaries/en_NZ.dic\')\nconst nodehun = new Nodehun(affix, dictionary)\n\nexport const suggest = (word) => hun_suggest(word);\n\nasync function hun_suggest(word) {\n let suggestions = await nodehun.suggest(word);\n console.log(suggestions);\n}\nRun Code Online (Sandbox Code Playgroud)\n深入研究一下上述错误的原因:
\nrequire\n\n已编译的插件二进制文件的文件扩展名是
\n.node(而不是.dll或.so)。require() 函数用于查找具有.node文件扩展名的文件并将它们初始化为动态链接库。
"type": "module",require它就不再受支持(如与 CommonJS 的互操作性中所指定):\n\n不支持使用
\nrequire加载ES模块,因为ES模块是异步执行的。相反,使用 import() 从 CommonJS 模块加载 ES 模块。
临时解决方案
\n经过一段时间的文档搜索,我找到了一个临时解决方案:自定义 ESM 说明符解析算法:
\n\n\n当前说明符解析不支持 CommonJS 加载器的所有默认行为。行为差异之一是文件扩展名的自动解析以及导入具有索引文件的目录的能力。\n该
\n--experimental-specifier-resolution=[mode]标志可用于自定义扩展名解析算法。\n要启用自动扩展名解析并从包含索引文件的目录导入索引文件使用该node模式。
tests/esm$ mkdir dictionaries && cd dictionaries\ntests/esm/dictionaries$ curl https://www.softmaker.net/down/hunspell/softmaker-hunspell-english-nz-101.sox > en_NZ.sox\ntests/esm/dictionaries$ unzip en_NZ.sox en_NZ.aff en_NZ.dic\nRun Code Online (Sandbox Code Playgroud)\n有一些帖子达到了相同的分辨率(参考 1、参考 2)。\n但是,使用实验标志似乎不是在生产环境中运行应用程序的正确方法。
\nesm包的替代方案失败
从那时起,已经尝试了几次失败的尝试来避免使用--experimental-*标志。经过一些搜索,我发现了一些推荐使用该包的帖子(参考文献 1,参考文献 2esm ) 。
然而,此时,当我尝试这个时node -r esm index.js,出现了一个新错误:
{\n ...\n "main": "index.js",\n "type": "module",\n ...\n}\nRun Code Online (Sandbox Code Playgroud)\n上述问题可能是由于报告的问题造成的(错误 [ERR_REQUIRE_ESM]:必须使用导入来加载 ES 模块/不支持 ES 模块的 require())。
\ntests/esm$ node index.js\nTypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".node" for tests/esm/node_modules/nodehun/build/Release/Nodehun.node\n... omitted ...\nat async link (node:internal/modules/esm/module_job:64:9) {\n code: \'ERR_UNKNOWN_FILE_EXTENSION\'\n}\nRun Code Online (Sandbox Code Playgroud)\nimport/ export(ES 模块)而不会引发import 插件问题?\n--experimental-specifier-resolution=node。esm可以解决上述问题。我的使用包有什么问题吗esm?\n任何有助于解决该问题的提示将不胜感激。
\n注意:示例的最终状态可以从https://github.com/rellampec/test-esm.git克隆
\n小智 5
我遇到了类似的问题并以这种方式修复: https ://nodejs.org/api/module.html#module_module_createrequire_filename
// The project is "type": "module" in package json
// createRequire is native in node version >= 12
import { createRequire } from 'module';
import path from 'path';
// Absolute path to node modules (or native addons)
const modulesPath = path.resolve(process.cwd(), 'node_modules');
// Create the require method
const localRequire = createRequire(modulesPath);
// require the native add-on
const myNativeAddon = localRequire('my-native-addon');
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1942 次 |
| 最近记录: |