2016-07-27 2 views
1

Я использую некоторые пакеты npm в моем проекте. У двух из них есть неправильное поле main. Можно ли их переопределить?npm - package.json переопределить основное поле

Я использую webpack. Я нашел решение here.

Это работает для основного поля, но мне также нужен css-файл из того же пакета. Я ссылаюсь на него ~package/css/style.css в файле index.scss. При решении выше он разрешает путь с path/to/main.js/css/style.css (с main.js) вместо path/to/css/style.css (без main.js).

Я мог бы направить его напрямую ../node_modules/path/to/css/style.css, но я думаю, что уродливый.

Итак, есть ли другое решение с webpack или npm для переопределения этого основного поля?

- EDIT -

Я использую bootstrap-treeview как пакет. Я ссылаюсь на него в index.scss так @import '~bootstrap-treeview/src/css/bootstrap-treeview.css';. Это работает.

Когда я добавляю 'bootstrap-treeview': path.join(_path, 'node_modules', 'bootstrap-treeview', 'src', 'js', 'bootstrap-treeview.js') как псевдоним в webpack import 'bootstrap-treeview'; работает, но css not (как описано выше).

- EDIT 2 -

webpack.conf.js:

resolve: { 
    extensions: ['', '.js'], 
    modulesDirectories: ['node_modules'], 
    alias: { 
    // bootstrap-treeview alias 
    'bootstrap-treeview': path.join(_path, 'node_modules', 'bootstrap-treeview', 'src', 'js', 'bootstrap-treeview.js') 
    } 
}, 
module: { 
    loaders: [ 
    { 
     test: /\.css$/, 
     loaders: [ 
     'style-loader', 
     'css-loader?sourceMap', 
     'postcss-loader' 
     ] 
    }, 
    { 
     test: /\.(scss|sass)$/, 
     loader: 'style-loader!css-loader?sourceMap!postcss-loader!sass-loader?outputStyle=expanded&sourceMap=true&sourceMapContents=true 
    } 
    ] 
} 

index.scss смотри выше.

Ошибка с самозагрузки-TreeView псевдоним:

Module not found: Error: Cannot resolve 'file' or 'directory' /home/ekf/develop/generator-angular-webpack/node_modules/bootstrap-treeview/src/js/bootstrap-treeview.js/src/css/bootstrap-treeview.css in ... 

Ошибка без псевдонима:

Module not found: Error: Cannot resolve module 'bootstrap-treeview' in ... 
+0

Вы уверены, что вы загружаете '.scss' файлы в Webpack? Не могли бы вы разместить код, где вы ссылаетесь на 'index.scss' и' style.css'? – Pavlo

+0

С '~ package/css/style.css' он работает. Как только я добавляю «псевдоним» в поле разрешения webpack, он решает его, как описано. – Piu130

+0

В 'bower.json' есть поле 'overrides' для точной этой цели. Есть ли что-то подобное в 'package.json'? – Piu130

ответ

0

только в случае

СКС погрузчик WebPack конфигурации

module: { 
    loaders: [ 
     { 
      test: /\.css$/, 
      exclude: /node_modules/, 
      loader: "style-loader!css-loader" 
     }, 
     { 
      test: /\.scss$/, 
      exclude: /node_modules/, 
      loader: "style-loader!css-loader!sass-loader" 
     } 
    ] 
} 
+0

И какой загрузчик я должен использовать для загрузки 'css' и' scss' из 'node_modules'? Он возвращает ошибку «Неожиданный токен». – Piu130

+0

«загрузчик стиля», «css-loader,« sass-loader »npm packages – peel3r

+0

Я имею в виду, когда я исключаю' node_modules', тогда файлы css внутри него не будут загружаться с помощью «загрузчика стиля», «css-loader», sass -loader». Он возвращает «Неожиданный токен», потому что для «css в node_modules» нет загрузчика. – Piu130

0

Проблема в том что лет ur alias указывает непосредственно на JS-файл, вместо того, чтобы указывать на общего предка как JS, так и CSS. Приятно и удобно иметь возможность import Treeview from "bootstrap-treeview", но это приводит к проблеме, которую вы описываете.

Вместо этого, вы можете указать более высокий уровень псевдоним:

resolve: { 
    alias: { 
    // bootstrap-treeview alias 
    'bootstrap-treeview': path.join(_path, 'node_modules', 'bootstrap-treeview', 'src') 
    } 
}, 

и получить JS, как import Treeview from "boostrap-treeview/js/bootstrap-treeview.js". Это позволяет получить CSS как require("bootstrap-treeview/css/bootstrap-treeview.css").

Возможно, вам удастся об этом подумать и скажите Webpack искать файлы CSS в файлах ~/css/ и JS в ~/js/, но это будет добавление большего количества магии для (IMHO) небольшого выигрыша.

Смежные вопросы