UNRESOLVED_IMPORT в Rollup возникает в момент, когда
сборщик не может найти модуль, указанный в операторе
import. Это означает, что на этапе построения графа
зависимостей Rollup обнаруживает ссылку на модуль, который не удаётся
разрешить ни через файловую систему, ни через установленные плагины
резолва.
Внутренне Rollup строит граф модулей, начиная с входной точки. Каждый
import преобразуется в попытку поиска файла. Если ни один
резолвер не может сопоставить путь с существующим модулем, фиксируется
предупреждение:
(!) Unresolved dependencies
https://rollupjs.org/guide/en/#warning-treating-module-as-external-dependency
Some modules could not be resolved:
some-module (imported by src/index.js)
Наиболее частый сценарий — модуль не установлен в
node_modules.
import lodash from 'lodash';
Если lodash отсутствует в проекте, Rollup не сможет его
разрешить.
Причины:
node_modules повреждёнОшибка часто возникает при опечатках в путях:
import utils from './util.js';
Файл фактически называется utils.js.
Особенность Rollup: он строго следует файловой системе и не делает «мягких» попыток угадывания.
В конфигурациях без соответствующего плагина резолва:
import helper from './helper';
Если файл существует как helper.js, Rollup без
@rollup/plugin-node-resolve не сможет его корректно
найти.
import fs from 'fs';
Некоторые встроенные модули Node.js требуют настройки
external, иначе Rollup либо помечает их как внешние, либо
не может корректно обработать в зависимости от окружения.
Некоторые пакеты используют:
exports поле в package.jsonБез соответствующих плагинов резолва Rollup может не понять точку входа:
import something from 'complex-package/sub/module';
Rollup сам по себе не является полноценным Node.js резолвером. Он использует плагины для расширения поведения.
Основная цепочка:
importresolveIdUNRESOLVED_IMPORTКлючевые плагины:
@rollup/plugin-node-resolve@rollup/plugin-commonjsexport default {
input: 'src/index.js',
output: {
file: 'dist/bundle.js',
format: 'esm'
}
};
При импорте npm-пакета:
import axios from 'axios';
без node-resolve возникает предупреждение.
import resolve from '@rollup/plugin-node-resolve';
export default {
input: 'src/index.js',
output: {
file: 'dist/bundle.js',
format: 'esm'
},
plugins: [
resolve()
]
};
Теперь Rollup корректно проходит по дереву
node_modules.
Даже при наличии node-resolve может возникнуть ситуация,
когда пакет экспортируется через CommonJS:
const lib = require('legacy-lib');
Rollup может не интерпретировать такие модули без:
import commonjs from '@rollup/plugin-commonjs';
plugins: [
resolve(),
commonjs()
]
При использовании alias-путей:
import Button from '@components/Button';
без настройки алиасов возникает UNRESOLVED_IMPORT.
Решение:
import alias from '@rollup/plugin-alias';
import path from 'path';
export default {
plugins: [
alias({
entries: [
{ find: '@components', replacement: path.resolve(__dirname, 'src/components') }
]
})
]
};
external на предупреждениеRollup может трактовать импорт как внешний:
external: ['react']
В этом случае:
UNRESOLVED_IMPORT может появляться, если резолв не
совпадает с ожиданиямиВажно различать:
external (осознанное исключение)unresolved (ошибка резолва)Файловая система:
package.json:
{
"module": "dist/index.js",
"main": "lib/index.js"
}
Некорректное поле может привести к невозможности резолва.
onwarn(warning, warn) {
if (warning.code === 'UNRESOLVED_IMPORT') {
console.log(warning);
}
warn(warning);
}
Проблема:
node_modulesРешение:
preserveSymlinksПри использовании tsconfig paths:
{
"paths": {
"@utils/*": ["src/utils/*"]
}
}
без @rollup/plugin-typescript и alias возникает
unresolved import.
import(`./modules/${name}.js`);
Rollup не всегда может статически проанализировать такие выражения,
что приводит к предупреждениям или необходимости ручного указания
manualChunks.
| Тип | Описание |
|---|---|
| UNRESOLVED_IMPORT | модуль не найден |
| MISSING_EXPORT | нет экспортируемого символа |
| CIRCULAR_DEPENDENCY | циклические зависимости |
UNRESOLVED_IMPORT всегда относится к этапу резолва, а не
к исполнению или типизации.
При --silent или onwarn без обработки:
undefined или
исключёнReferenceErrorПоследовательность анализа:
node_modulesnode-resolve и
commonjsexternalЕсли модуль не найден и не критичен:
Если модуль критичен для графа:
ESM требует статического анализа импортов.
UNRESOLVED_IMPORT часто является следствием того, что:
Rollup строго следует ESM-модели и не выполняет код для поиска модулей, что усиливает вероятность появления предупреждения при некорректной структуре проекта.