Глоток требует псевдоним - PullRequest
0 голосов
/ 25 апреля 2020

Я ищу безопасный способ использовать псевдонимы, используя gulp. Идея похожа на то, что веб-пакет предлагает с псевдонимом разрешения .

Например, я добавляю в свой исходный код что-то вроде require('@plugin/utils'), и оно переводится в нечто, выбранное мной, например require('$/plugins/longer/namespace/utils'). Вы, вероятно, заметили, что он не соответствует ни одному действительному пути к файлу, и это преднамеренно (это файлы tiddlywiki, если кому-то интересно). Лучшее, что я нашел, это gulp-replace , но в худшем случае он использует замены строк и в лучшем случае регулярные выражения. В идеале я хотел бы что-то более надежное, что-то, что знает AST, поэтому я уверен, что я никогда не заменю неправильную строку (например, строку шаблона). Я также использую babel, поэтому, если есть плагин babel, который я могу использовать, я тоже буду этому рад. В качестве последнего средства я могу попытаться написать некоторый плагин babel или плагин gulp, используя esprima, но esprima не соответствует современному JS стандарту (не анализирует распространение объекта), и я бы предпочел создать другой инструмент.

Спасибо заранее

1 Ответ

0 голосов
/ 26 апреля 2020

Наконец я нашел модуль babel ( babel-plugin-module-resolver ), который я могу интегрировать с gulp и с некоторыми дополнительными настройками c с eslint.

Итак это то, что я добавил в свой конвейер gulp (упрощенно)

    const babelCfg = {
    plugins: [[
            require.resolve('babel-plugin-module-resolver'),
            {
                root: [ `${pluginSrc}/**` ],
                alias: { '@plugin': `$:/plugins/${pluginNamespace}` },
                loglevel: 'silent',
            }
          ]],
      };
   return gulp
        .src(`${pluginSrc}/**/*.js`)
        .pipe(babel(babelCfg))
        .pipe(gulp.dest(outPath.dist));

, который преобразует все ссылки в require('@plugin/xxxx') с правильным путем. С некоторыми дополнительными настройками вы даже можете заставить eslint предупреждать вас о неправильном разрешении пути. Вы должны настроить его по-другому, потому что eslint нужен реальный путь, а выходные файлы - специальное пространство имен. После установки eslint-import-resolver-babel-module и eslint-plugin-import вот что вам нужно добавить в конфигурацию eslint, чтобы она заработала:

plugins:
    - import

env:
    node: true
    browser: true

settings:
    import/resolver:
        babel-module:
            root: ./src/**
            alias:
                "@plugin": ./src/the/real/path

rules:
    import/no-unresolved: [2, { commonjs: true }]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...