Я все еще не понимаю, как разрешить пути модулей с помощью веб-пакета. Теперь я пишу:
myfile = require('../../mydir/myfile.js')
но я хотел бы написать
myfile = require('mydir/myfile.js')
Я думал, что resol.alias может помочь, так как я вижу похожий пример, использующий в { xyz: "/some/dir" }
качестве псевдонима, тогда я могу require("xyz/file.js")
.
Но если я установлю свой псевдоним { mydir: '/absolute/path/mydir' }
, require('mydir/myfile.js')
не будет работать.
Я чувствую себя глупо, потому что много раз читал документ и чувствую, что что-то упустил. Как правильно избегать записи всех относительных требований с помощью ../../
etc?
javascript
webpack
gpbl
источник
источник
resolve.alias
работает именно так, как вы предложили. Интересно, не получилось ли это из-за чего-то еще в вашейresolve
конфигурации. Я пользуюсьalias{ mydir: path.resolve( __dirname, 'path', 'to', 'mydir' )
иrequire( 'mydir/myfile.js' )
работает просто отлично.Ответы:
Webpack> 2.0
Смотри ответ wtk .
Webpack 1.0
Более простой способ сделать это - использовать resol.root.
http://webpack.github.io/docs/configuration.html#resolve-root
В твоем случае:
Конфигурация веб-пакета
модуль потребления
или
см. также: http://webpack.github.io/docs/configuration.html#resolve-modulesdirectories
источник
root
,modulesDirectories
и смесь обоих, но это не сработало. Кажется, что субмодули (напримерrequire("mydir/file")
) не принимаются.WebpackOptionsValidationError: Invalid configuration object. Webpack has been initialised using a configuration object that does not match the API schema. - configuration.resolve has an unknown property 'root'.
Для дальнейшего использования, webpack 2 удалил все, кроме
modules
как для разрешения путей. Это значитroot
, не будет работать.https://gist.github.com/sokra/27b24881210b56bbaff7#resolving-options
Пример конфигурации начинается с:
источник
modulesDirectories
все еще используется webpack-dev-server, даже с webpack 2, что делает это очень запутанным.resolve.alias
должно работать точно так, как вы описали, поэтому я привожу это в качестве ответа, чтобы смягчить любую путаницу, которая может возникнуть в результате предположения в исходном вопросе, что оно не работает.Конфигурация разрешения, подобная приведенной ниже, даст вам желаемые результаты:
require( 'mydir/myfile.js' )
будет работать как положено. Если это не так, должна быть другая проблема.Если у вас есть несколько модулей, которые вы хотите добавить в путь поиска, это
resolve.root
имеет смысл, но если вы просто хотите иметь возможность ссылаться на компоненты в коде приложения без относительных путей, этоalias
кажется наиболее прямым и явным.Важным преимуществом
alias
является то, что он дает вам возможность использовать пространство имен,require
что может внести ясность в ваш код; точно так же, как легко увидеть из другихrequire
s, на какой модуль ссылаются, онalias
позволяет вам писать описательныеrequire
s, которые делают очевидным, что вам нужны внутренние модули, напримерrequire( 'my-project/component' )
.resolve.root
просто помещает вас в нужный каталог, не давая вам возможности продолжить пространство имен.источник
alias: {'~': path.resolve(__dirname)},
require('mydir/myfile')
)? Это на самом деле должно работать. Вы можете иметь несколько записей вalias
; Я использую это для импорта из моегоsrc
каталога для модулей JavaScript, а другой - для импорта из моегоstyles
каталога для CSS. Дайте мне знать, если я полностью не понял ваш вопрос.import './path/to/Component1';
- просто без внутреннего имени файла и расширения в пути. Веб-пакет каким-то образом удалось обнаружить, что Внутренний файл имеет имя каталога, и просто импортировал его. Теперь, что я хочу сделать, это импортировать это так:import 'shared\Component1';
когда «общий» это псевдоним. но это не работает без указания внутреннего имени файла. Спасибо!В случае, если кто-то столкнется с этой проблемой, я смог заставить ее работать так:
где моя структура каталогов:
Тогда из любого места в
src
каталоге я могу позвонить:источник
'node_modules'
вместо.[ path.resolve(__dirname, 'src'), 'node_modules' ],
lodash
, я хочуlodash
получить разрешение ТОЛЬКО изprojectA/node_modules
. Это то, чтоresolve.modules: [path.resolve(__dirname, 'node_modules')]
полезно. Однако я сталкиваюсь с проблемами с зависимостями, как вы сказали. Есть ли способ сказать webpack, чтобы он также находил подзависимости в дополнение к ограничению разрешения node_modulesprojectA/node_modules
?Моя самая большая головная боль работала без пути в пространстве имен. Что-то вроде этого:
До того, как я установил свою среду для этого:
Я нашел гораздо более удобным избегать неявного
src
пути, который скрывает важную контекстную информацию.Моя цель - потребовать вот так:
Как видите, весь код моего приложения находится в пространстве имен обязательного пути. Это ясно дает понять, какие вызовы требуют библиотеки, кода приложения или тестового файла.
Для этого я должен убедиться, что мои пути разрешения
node_modules
и текущая папка приложения, если вы не поместите свое приложение в папку с исходным кодом, какsrc/my_app
Это мой по умолчанию с веб-пак
Было бы еще лучше, если вы установите переменную окружения
NODE_PATH
в файл текущего проекта. Это более универсальное решение, и оно поможет, если вы захотите использовать другие инструменты без веб-пакета: тестирование, линтинг ...источник
Я решил это с Webpack 2 следующим образом:
Вы можете добавить больше каталогов в массив ...
источник
Решил это с помощью Webpack 2:
источник
Если вы используете create-реагировать-приложение , вы можете просто добавить
.env
файл, содержащийИсточник: https://medium.com/@ktruong008/absolute-imports-with-create-react-app-4338fbca7e3d
источник
Эта ветка старая, но поскольку никто не писал о require.context, я собираюсь упомянуть об этом:
Вы можете использовать require.context, чтобы настроить просмотр папки следующим образом:
источник
Я не понял, почему кто-то предложил включить родительский каталог myDir в modulesDirectories в веб-пакете, что должно легко сработать:
источник
Просто используйте babel-plugin-module-resolver :
Затем создайте
.babelrc
файл под root, если у вас его еще нет:И все под root будет восприниматься как абсолютный импорт:
Для поддержки VSCode / Eslint, смотрите здесь .
источник