Неправильный путь URL-адресов шрифтов и включает css путь после сборки WebPack - PullRequest
0 голосов
/ 04 августа 2020

Я не могу придумать правильную комбинацию, чтобы все это было счастливым. У меня есть MiniCssExtractPlugin create css или меньше файлов.

Я импортирую файл less и css в src / client / index.tsx :

import './less/master.less';
import '../../ext/ink-3.1.10/css/ink.min.css';

webpack.config. js затем выполняет свои задачи c с помощью MiniCssExtractPlugin:

Примечание : причины, по которым я иметь publicPath : '' для загрузчика css потому, что когда у меня он был как publicPath : '/ lib / css ', он добавлял это к URL-адресу шрифта, поэтому, удалив, что URL-адреса шрифтов больше не имели проблемы, по крайней мере, после того, как webpack создал dist основной проблемы, которую я все еще вижу во время выполнения. Честно говоря, я не знаю, нужно ли мне вообще устанавливать здесь publicPath, потому что в любом случае он по умолчанию "" .

Изменив его затем на publicPath : '' , удалил часть /lib/css из /lib/css/lib/assets/fonts, и я подумал , который устранил мою проблему, но затем во время выполнения он все еще пытается поразить шрифты через /lib/css/lib/assets/fonts, что сбивает меня с толку

const path = require('path');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const TerserJSPlugin = require('terser-webpack-plugin');
const HtmlWebPackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
const CopyPlugin = require('copy-webpack-plugin');

const isProduction = process.env.NODE_ENV === 'production';

const html = () => {
 return new HtmlWebPackPlugin({
  template: path.resolve(__dirname, 'src/client', 'index.html'),
  filename: 'index.html',
  hash: true,
 });
};

const copyAllOtherDistFiles = () => {
 return new CopyPlugin({
  patterns: [
   { from: 'src/client/assets', to: 'lib/assets' },
   { from: 'package.json', to: './' },
   { from: 'ext/ink-3.1.10/js/ink-all.min.js', to: 'lib/js' },
   { from: 'ext/ink-3.1.10/js/autoload.min.js', to: 'lib/js' },
   { from: 'ext/js/jquery-2.2.3.min.js', to: 'lib/js' },
   { from: 'feed.xml', to: './' },
   {
    from: 'src/shared',
    to: './shared',
    globOptions: {
     ignore: ['**/*suppressed.json'],
    },
   },
  ],
 });
};

module.exports = {
 entry: './src/client/index.tsx',
 output: {
  filename: 'scripts/app.[hash].bundle.js',
  publicPath: '',
  path: path.resolve(__dirname, 'dist'),
 },
 resolve: {
  extensions: ['.ts', '.tsx', '.js'],
 },
 devtool: isProduction ? '' : 'eval-cheap-source-map',
 devServer: {
  writeToDisk: true,
  contentBase: path.resolve(__dirname, 'dist'),
  port: 8080,
 },
 optimization: {
  minimizer: [new TerserJSPlugin({}), new OptimizeCSSAssetsPlugin({})],
  splitChunks: {
   cacheGroups: {
    styles: {
     name: 'styles',
     test: /\.css$/,
     chunks: 'all',
     enforce: true,
    },
   },
  },
 },
 module: {
  rules: [
   {
    test: /\.(js)$/,
    exclude: /node_modules/,
    use: {
     loader: 'babel-loader',
    },
   },
   {
    test: /\.(tsx|ts)?$/,
    use: 'ts-loader',
    exclude: /node_modules/,
   },
   {
    test: /\.html$/,
    use: [
     {
      loader: 'html-loader',
     },
    ],
   },
   {
    test: /\.less$/,
    use: [MiniCssExtractPlugin.loader, 'css-loader', 'less-loader'],
   },
   {
    test: /\.css$/,
    use: [
     {
      loader: MiniCssExtractPlugin.loader,
      options: {
       publicPath: '',
      },
     },
     'css-loader',
    ],
   },
   {
    test: /\.(woff|woff2|eot|ttf|otf)$/,
    loader: 'file-loader',
    options: {
     outputPath: 'lib/assets/fonts',
    },
   },
   {
    test: /\.(png|svg|jpg|gif)$/,
    use: ['url-loader'],
   },
  ],
 },
 plugins: [
  new CleanWebpackPlugin(),
  copyAllOtherDistFiles(),
  new MiniCssExtractPlugin({
   filename: isProduction ? 'lib/css/[name].[hash].css' : 'lib/css/main.css',
  }),
  html(),
 ],
};

api. js

const compression = require('compression'),
 express = require('express'),
 historyApi = require('connect-history-api-fallback'),
 oneYear = 31536000;

module.exports = express()
 .use(compression())
 .on('error', (err: string) => {
  console.log(err);
 })
 .use(historyApi())
 .use(
  express.static('dist', {
   maxage: oneYear,
  })
 )
 .use((_req: any, res: any) => {
  res.send('Sorry, Page Not Found');
 });

Таким образом, проблема возникает во время времени выполнения с ink.min.css, потому что он ссылается на некоторые шрифты, которые я также обрабатывается с помощью file-loader, как вы можете видеть выше. Проблема в том, что когда я запускаю сайт в режиме разработки через NODE_ENV=development webpack-dev-server --open, я получаю несколько запросов на эти шрифты, потому что он добавляет /lib/css/lib/assets/fonts вместо /lib/assets/ шрифтов во время выполнения:

enter image description here

The weird thing about this though is when I go to my dist folder, when I look at styles.main.css (which apparently it renamed ink.min.css to this for some odd reason, the url to the fonts don't have that extra /lib/css so I don't understand why when my browser loads it's trying to reference it with that extra part still:

enter image description here

Another thing that's kinda weird is I do see images loading but when I look at the source in the browser, I don't see my assets folder. I know dist definitely contains it, but it doesn't show it here: введите описание изображения здесь

1 Ответ

0 голосов
/ 04 августа 2020

Я не понимаю, почему это исправлено. Мне все это кажется хакерским.

Я изменил его на publicPath: '../../'

test: /\.css$/,
    use: [
     {
      loader: MiniCssExtractPlugin.loader,
      options: {
       publicPath: '../../',
      },
     },
     'css-loader',
    ],

Думаю, я загружаю свой. css файл, а затем нахожусь в контексте из / lib / css уже, поэтому мои URL-адреса шрифтов имеют / lib / css, я думаю? и мне по какой-то причине нужно, чтобы MiniCssExtractPlugin имел путь publi c в root? Я не понимаю.

Также теперь я вижу папку с ресурсами, wt ???

введите описание изображения здесь

...