Импорт модуля Node/JS, require/import, module/commonjs

171
01 октября 2021, 07:50

Пытаюсь достучаться до импорта модулей.

Желание: использовать require и import независимо от типа модулей(module_es6/commonjs) без дополнительных библиотек.

В каталогах(картинка) demo-* - экспорт
В каталогах import-as-* - импорт того что в demo-*

Модули *-commonjs описаны в стиле module.exports/require
Модули *-module описаны в стиле export/import
Пример:

// "type": "commonjs"
module.exports = () => {
    return "i commonjs"
}
// "type": "module"
export default () => {
    return "i module"
}

В каждом package.json добавлено соответствующее свойство "type": "module/commonjs"
Пример:

{
    "name": "demo-module",
    "main": "./index.js",
    "type": "module"
}

Node(-v v12.13.0) запускается с флагом --experimental-modules и --es-module-specifier-resolution=node

С импортом из import-as-module все нормально, импортируется в том числе и модуль demo-commonjs.
А вот из import-as-commonjs не импортирует из require('../demo-module') ничего.

Error [ERR_REQUIRE_ESM]:  
Must use import to load ES Module: ...path.../demo-module/index.js

Как добиться желаемого результата?

Ниже невыполнимый сниппет!!!

// + ПРИМЕРЫ ЭКСПОРТА 
 
// demo-commonjs | package.json->{name, main,"type": "commonjs"} 
module.exports = () => { 
    return "i commonjs" 
} 
 
// demo-module | package.json->"type": "module" 
const CONST_MOD = 'CONST_MOD' 
export { CONST_MOD } 
export default () => { 
    return "i module" 
} 
 
 
// + ПРИМЕРЫ ИМПОРТА 
 
// import-as-module | package.json->"type": "module" 
import CommonJS from '../demo-commonjs' 
console.log(CommonJS()) 
import def, { CONST_MOD } from '../demo-module' 
console.log(def()) 
console.log(CONST_MOD) 
 
// import-as-commonjs | package.json->"type": "commonjs" 
const CommonJS = require('../demo-commonjs') 
console.log(CommonJS()) 
// ЗДЕСЬ ПОЛУЧАЮ ОШИБКУ 
try { 
    var CONST_MOD = require('../demo-module') 
} 
catch (error) { 
    console.error(error) // Must use import to load ES Module: 
} 
console.log(CONST_MOD) // undefined

Answer 1

https://nodejs.org/dist/latest-v12.x/docs/api/esm.html#esm_code_require_code

require always treats the files it references as CommonJS.

Так что ваше желание невыполнимо.

READ ALSO
Как правильно в данном случае поступить с функцией, как при вызове функции пропускать параметры

Как правильно в данном случае поступить с функцией, как при вызове функции пропускать параметры

Есть задачаНаписать функцию, которая принимает время (часы, минуты, секунды) и выводит его на экран в формате «чч:мм:сс»

198
JS. Как обращаться к вложенным функциям?

JS. Как обращаться к вложенным функциям?

Как обратиться к вложенной функции и вложенной в нее функции?

179
Округление числа до следующего целого числа десятков

Округление числа до следующего целого числа десятков

Возможно ли в JavaScript округлять числа по следующей схеме:

131
Не могу подключить валидацию форм

Не могу подключить валидацию форм

Появляется много ошибок и при нажатии на кнопку добавляется +1 ошибка

65