Как включить использование запроса и импорта в файле javascript?

У меня есть package.json ниже, я использую пакет и пытаюсь использовать как требование, так и импорт в одном файле; чтобы сделать это, вот что сделал до сих пор, но не работает

Первое испытание

// package.json (v1)
{
  "main": "src/index.js",
  "scripts": {
    "start": "node src/index.js"
  },
  "dependencies": {
    "@xkeshav/day": "latest"
  }
}

и называется, как показано ниже

// src/index.js
const { oneDay } = require("@xkeshav/day");
console.info({ oneDay });
console.info("Hello from template repository");

выше работает нормально


теперь меняется с require на import утверждение

import { oneDay } from "@xkeshav/day";
console.info({ oneDay });

и при запуске файла выдает ошибку

(node:14233) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
(Use `node --trace-warnings ...` to show where the warning was created)
/home/recursive/dev/template/src/index.js:1
import { oneDay } from "@xkeshav/day";
^^^^^^

SyntaxError: Cannot use import statement outside a module

выделять

добавьте type:"module" в package.json

так добавлено, как показано ниже

// package.json ( v2 )
{
  "type": "module",
  "main": "src/index.js",
  "scripts": {
    "start": "node src/index.js"
  },
  "dependencies": {
    "@xkeshav/day": "latest"
  }
}

и теперь это работает.


теперь удалено утверждение import и добавлено утверждение require

const { oneDay } =  require("@xkeshav/day");
console.info({ oneDay });

и запустите файл; это выдает ошибку

at /src/index.js:1
const { oneDay } = require("@xkeshav/day");
                   ^

ReferenceError: require is not defined in ES module scope, you can use import instead
This file is being treated as an ES module because it has a '.js' file extension and '/home/recursive/dev/template/package.json' contains "type": "module". To treat it as a CommonJS script, rename it to use the '.cjs' file extension.

Изюминкой является

package.json содержит «type»: «module». Чтобы рассматривать его как сценарий CommonJS, переименуйте его, используя расширение файла «.cjs».

поэтому переименуйте index.js в index.cjs и также внесите изменения в package.json.

// package.json ( v3 )
{
  "type": "module",
  "main": "src/index.cjs",
  "scripts": {
    "start": "node src/index.cjs"
  },
  "dependencies": {
    "@xkeshav/day": "latest"
  }
}

это работает.


импортировать и требовать вместе

теперь добавьте оператор import вместе с require, как показано ниже.

const { oneDay } = require("@xkeshav/day");

import { oneDay as dayOne } from "@xkeshav/day";

console.info({ oneDay, dayOne });
console.info("Hello from template repository");

и при запуске файла; это выдает ошибку

(node:14757) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
(Use `node --trace-warnings ...` to show where the warning was created)
at src/index.cjs:3
import { oneDay as dayOne } from "@xkeshav/day";
^^^^^^

SyntaxError: Cannot use import statement outside a module

Выделять

установите «type»: «module» в package.json или используйте расширение .mjs

поэтому переименуйте index.cjs в index.mjs и также запустите package.json

 // # package.json ( v4 )
{
  "type": "module",
  "main": "src/index.mjs",
  "scripts": {
    "start": "node src/index.cjs"
  },
  "dependencies": {
    "@xkeshav/day": "latest"
  }
}

теперь выдает другую ошибку


> @xkeshav/[email protected] start
> node src/index.mjs
at src/index.mjs:1
const { oneDay } = require("@xkeshav/day");
                   ^

ReferenceError: require is not defined in ES module scope, you can use import instead

так как же мы можем использовать оба типа синтаксиса в одном файле? и какое расширение файла будет «.mjs», «.cjs» или «.js», и какие изменения требуются в package.json?

🤔 А знаете ли вы, что...
JavaScript поддерживает модульную структуру, что способствует организации кода на больших проектах.


53
1

Ответ:

Решено

Чтобы использовать require и import в одном файле, вам необходимо обрабатывать их в зависимости от того, используете ли вы модули CommonJS или ES:

Вариант 1: CommonJS (файл .cjs)

  • Используйте require как обычно.
  • Для import используйте синтаксис динамического импорта:
// src/index.cjs
const { oneDay } = require("@xkeshav/day");

(async () => {
  const { oneDay: dayOne } = await import("@xkeshav/day");
  console.info({ oneDay, dayOne });
})();

В package.json установите "type": "commonjs".

Вариант 2: Модуль ES (файл .mjs)

  • Используйте import как обычно.
  • Для require используйте createRequire:
// src/index.mjs
import { oneDay as dayOne } from "@xkeshav/day";
import { createRequire } from "module";
const require = createRequire(import.meta.url);
const { oneDay } = require("@xkeshav/day");

console.info({ oneDay, dayOne });

В package.json установите "type": "module".

Что использовать?

  • Используйте .cjs, если вы предпочитаете CommonJS (require).
  • Используйте .mjs, если вы предпочитаете модули ES (import).

Таким образом, вы можете смешивать require и import в одном файле.