3

如何向 Nodejs 动态导入添加新的文件扩展名?我想添加我自己的文件类型,我们称之为 .jszip。(不,这只是一个例子,我真正想要的与 zip 无关)。

假设我有 package.json:

{
  "name": "test",
  "scripts": {
    "zip": "node --experimental-modules test.js"
 }
}

测试.js:

const fs = require('fs');
const Module = require('module');

function loadJsZip(module, filename) {
  console.log('In loadJsZip');
  const content = fs.readFileSync(filename, 'utf8');
  // Do something to content
  module._compile(content, filename);
}

require.extensions['.jszip'] = loadJsZip;
Module._extensions['.jszip'] = loadJsZip;


function loadJs(relativePath) {
   import(f).then((module) => {
    console.log(`imported from ${filename}:${module}`);
  }).catch((err) => {
    console.log(`While importing:${err}`);
  });
}

loadJs('./testfile.jszip');

我正进入(状态:

(node:20412) ExperimentalWarning: The ESM module loader is experimental.
While importing:TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension: c:\...\testfile.jszip
4

1 回答 1

2

似乎不支持其他文件类型:https ://nodejs.org/api/esm.html#esm_import_statements

对我的情况有用的是恢复正常require并使用它。所以我正在.graphql使用以下方法导入文件:

import {createRequire} from 'module';
const require = createRequire(import.meta.url);
require('graphql-import-node/register');

const myQuery = require('./myquery.graphql');

graphql-import-node 包require.extension[] =在幕后做了一个:

require.extensions['.graphql'] = loadPlainFile

但这开始变得疯狂。您可能最好使用 Webpack 或其他东西。

于 2020-03-25T12:58:50.677 回答