Javascript-форум (https://javascript.ru/forum/)
-   Сборка проекта, утилиты (https://javascript.ru/forum/server-tools/)
-   -   webpack v5: loader package.json => js код (https://javascript.ru/forum/server-tools/82238-webpack-v5-loader-package-json-%3D-js-kod.html)

Shasoft 06.04.2021 17:04

webpack v5: loader package.json => js код
 
Пытаюсь написать loader, который загружает package.json и по его содержимому генерирует нужный мне javascript код.

Однако получаю ошибку
SyntaxError: Unexpected token / in JSON at position 0 while parsing near '/* Д  инамические импо...'

Собственно понятно что webpack после моего загрузчика пытается ещё что-то применить и считает что формат JSON и из-за этого ошибка. В частности ругается на комментарий в начале.

В webpack 4 я делал так чтобы изменить тип с json на javascript
const requiredType = 'javascript/auto';
const factory = this._compilation.dependencyFactories.get(LoaderDependency);
this._module.type = requiredType;
this._module.generator = factory.getGenerator(requiredType);
this._module.parser = factory.getParser(requiredType);

но в webpack 5 это не работает, так как ругается на отсутствующий метод getGenerator (как оказалось потому что factory = undefined). К тому же переменные начинающиеся с _ как бы намекают что это какое-то шаманство.

В связи с этим вопрос: что нужно сделать чтобы подключая вот так
import aaa from '!my-loader!./package.json';
чтобы я получал javascript код который генерирует мой loader?

Aetae 06.04.2021 21:02

Ну попробуй
import aaa from '!!my-loader!./package.json';
:)

Shasoft 06.04.2021 21:23

Цитата:

Сообщение от Aetae (Сообщение 535333)
Ну попробуй
import aaa from '!!my-loader!./package.json';
:)

Пробовал, не помогает.

Aetae 06.04.2021 21:30

На самом деле - это невозможно. Двойное восклицание гарантировано отрубает любые лоадеры кроме указанного.
Скорее всего косяк где-то в другом месте, но для гарантии можно сделать следующее:
1. Удалить node_modules/.cache - девтулзы порой агрессивно кэшрются.
2. Попробовать использовать raw-loader вместо вашего и посмотреть что он выдаёт.

Shasoft 06.04.2021 21:49

В webpack 5 raw-loader DEPREACTED for v5: please consider migrating to asset modules.

Shasoft 06.04.2021 22:02

Поставил raw-loader
./package.json (./node_modules/raw-loader/dist/cjs.js!./package.json)
Module parse failed: Unexpected token e in JSON at position 0 while parsing near 'export default "{\n ...'
File was processed with these loaders:
 * ./node_modules/raw-loader/dist/cjs.js
You may need an additional loader to handle the result of these loaders.
  SyntaxError: Unexpected token e in JSON at position 0 while parsing near 'expo  rt default "{\n ...'

Shasoft 06.04.2021 22:05

- JSON.parse

- index.js:7 parseJson
[q-ssa]/[json-parse-better-errors]/index.js:7:17

- JsonParser.js:16 JsonParser.parse
[q-ssa]/[webpack]/lib/JsonParser.js:16:16

- NormalModule.js:482
[q-ssa]/[webpack]/lib/NormalModule.js:482:32

- NormalModule.js:358
[q-ssa]/[webpack]/lib/NormalModule.js:358:12

- LoaderRunner.js:373
[q-ssa]/[loader-runner]/lib/LoaderRunner.js:373:3

- LoaderRunner.js:214 iterateNormalLoaders
[q-ssa]/[loader-runner]/lib/LoaderRunner.js:214:10

- LoaderRunner.js:221 iterateNormalLoaders
[q-ssa]/[loader-runner]/lib/LoaderRunner.js:221:10

- LoaderRunner.js:236
[q-ssa]/[loader-runner]/lib/LoaderRunner.js:236:3

- LoaderRunner.js:130 runSyncOrAsync
[q-ssa]/[loader-runner]/lib/LoaderRunner.js:130:11

Aetae 06.04.2021 23:08

В общем заставил ты меня зарыться в это говно: виновата новая суперфича "asset modules"(теперь там две разных системы для одного и того же, блджад).
Чтобы твой loader заработал, надо явно переопределить тип в самом конфиге:
{
  test: /\.json$/,
  use: [
    'raw-loader'
  ],
  *!*type: 'javascript/auto'*/!*
}

Ну или, если нужно только локально:
{
  resourceQuery: /^\?raw-loader/,
  use: [
    'raw-loader'
  ],
  type: 'javascript/auto'
}

import aaa from './package.json?raw-loader';

А надёжнее и универсальнее:
{
  resourceQuery: /fuck-assets/,
  type: 'javascript/auto'
}

import aaa from '!raw-loader!./package.json?fuck-assets';


Это всё есть в документации, но загорелось у меня знатно. Просто взяли и обосрали стройную систему loader'ов. Теперь вообще непонятно через какую жопу грузится какой файл, что и где переопределять.


Часовой пояс GMT +3, время: 09:22.