Настройте Webpack для разрешения относительных путей

Я пытаюсь внедрить Материальные веб-компоненты в свое веб-приложение в соответствии с Руководство по началу работы веб-компонента материалов.

Мне удалось успешно настроить Webpack (V3) для загрузки SASS для веб-компонента. Это произошло после того, как возникла проблема с путем включения. Я смог решить эту проблему, добавив эту строку в свой webpack.config.js.

{
    loader: 'sass-loader',
    options: {
        includePaths: ['./node_modules']
    }
}

Однако компиляция JS оказалась не столь успешной.

Речь идет о компоненте Верхняя панель приложений от Material Web.

В моем основном файле js у меня есть следующее:

import {MDCTopAppBar} from './../../node_modules/@material/top-app-bar/index.js';
const topAppBarElement = document.querySelector('.mdc-top-app-bar');
const topAppBar = new MDCTopAppBar(topAppBarElement);

Изначально я выразился так:

import {MDCTopAppBar} from './node_modules/@material/top-app-bar/index';

Но Webpack пожаловался, что файл не может быть найден:

Module not found: Error: Can't resolve './node_modules/@material/top-app-bar/index'.

Я попытался добавить этот код в свой webpack.config.js на основе документации Webpack Module.alias, чтобы обойти эту ошибку, но безрезультатно (вероятно, моя ошибка в реализации):

resolve: {
    alias: {
        MDCTopAppBar: path.resolve(__dirname, 'node_modules/@material/')
    }
}

Увы, код компилируется, но в DevTools Chrome я получаю следующую ошибку:

Uncaught TypeError: Failed to resolve module specifier "@material/base/component". Relative references must start with either "/", "./", or "../".

Эта ошибка возникает из-за файла Верхняя панель приложенийindex.js, который импортирует множество других компонентов:

import MDCTopAppBarAdapter from './adapter';
import MDCComponent from '@material/base/component';
import {MDCRipple} from '@material/ripple/index';
import {cssClasses, strings} from './constants';
import MDCTopAppBarBaseFoundation from './foundation';
import MDCFixedTopAppBarFoundation from './fixed/foundation';
import MDCShortTopAppBarFoundation from './short/foundation';
import MDCTopAppBarFoundation from './standard/foundation';

Вот изображение того, как выглядит файловая структура для компонента Top App Bar:

/node_modules
  /@material
    /base
    /ripple
    /top-app-bar
      -adapter.js
      -constants
      -index.js
/src
  -main.js

В top-app-bar/index.js я мог вручную просмотреть этот файл (и любые последующие модули, которые я хочу включить) и переписать все пути как относительные, но это ужасный подход.

Как я могу настроить Webpack для автоматического разрешения этих относительных путей?

Я пробовал использовать resolve.modules в различных мутациях, подобных этой, но безуспешно:

resolve: {
     modules: [
        path.resolve(__dirname, 'node_modules/@material'),
        path.resolve(__dirname, 'node_modules/@material/base/'),
        path.resolve(__dirname, 'node_modules/@material/base/component'),
        path.resolve(__dirname, 'node_modules/@material/top-app-bar/'),
        'node_modules'
     ]
 }

Вот мои зависимости проекта:

"dependencies": {
    "@material/top-app-bar": "^0.40.1"
  },
  "devDependencies": {
    "autoprefixer": "^9.2.0",
    "babel-core": "^6.26.3",
    "babel-loader": "^7.1.5",
    "babel-plugin-transform-object-assign": "^6.22.0",
    "babel-preset-es2015": "^6.24.1",
    "css-loader": "^1.0.0",
    "extract-loader": "^3.0.0",
    "file-loader": "^2.0.0",
    "grunt": "^1.0.3",
    "grunt-contrib-sass": "^1.0.0",
    "grunt-contrib-watch": "^1.1.0",
    "node-sass": "^4.9.4",
    "postcss-loader": "^3.0.0",
    "sass": "^1.14.2",
    "sass-loader": "^7.1.0",
    "webpack": "^3.12.0",
    "webpack-cli": "^3.1.2",
    "webpack-dev-server": "^2.11.3"
  }

Я полагаю, что мне нужно либо выяснить, что я делаю не так с настройкой webpack, либо настроить такой пакет, как babel-loader, чтобы отсортировать пути, либо реализовать собственное решение, подобное повышенная решимость webpack, но только в крайнем случае.

Заранее спасибо!

Это в точности мой вопрос stackoverflow.com/questions/52860296/…

Jacob Phillips 18.10.2018 17:14

Приятно знать, что я не единственный, кто застрял на том, что кажется тривиальной проблемой :)

Jacob Phillips 18.10.2018 17:18

@JacobPhillips Я нашел подтверждение проблемы в качестве примечания в этом Краткое руководство пользователя. Возможное решение - использовать плагин, такой как rollup-plugin-includepaths, чтобы разрешить использование относительных путей, но это еще не тестировалось.

David Gaskin 19.10.2018 11:36

Большое спасибо за то, что указали мне на это репо!

Jacob Phillips 19.10.2018 16:26

По сути, я обнаружил, что относительные пути не могут быть разрешены динамически (при загрузке), они должны быть включены в процесс связывания, например, с помощью webpack. Существует Google Codelab, использующий материальные веб-компоненты, которые вы можете проанализировать на предмет их конфигурации.

David Gaskin 22.10.2018 22:39

Да, в том кратком руководстве, на которое вы ссылались, сказано, что они используют пакет polymer-cli для обслуживания html, так что я и сделал.

Jacob Phillips 23.10.2018 03:14
Поиск всех неиспользуемых файлов в проекте
Поиск всех неиспользуемых файлов в проекте
Количество файлов в проекте растет по мере его развития. И если быть по-настоящему честным, их продвижение происходит в геометрической прогрессии...
Настройка шаблона Metronic с помощью Webpack и Gulp
Настройка шаблона Metronic с помощью Webpack и Gulp
Я пишу эту статью, чтобы поделиться тем, как настроить макет Metronic с помощью Sass, поскольку Metronic предоставляет так много документации, и они...
1
6
2 442
0

Другие вопросы по теме