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? |
Ну попробуй
import aaa from '!!my-loader!./package.json';:) |
Цитата:
|
На самом деле - это невозможно. Двойное восклицание гарантировано отрубает любые лоадеры кроме указанного.
Скорее всего косяк где-то в другом месте, но для гарантии можно сделать следующее: 1. Удалить node_modules/.cache - девтулзы порой агрессивно кэшрются. 2. Попробовать использовать raw-loader вместо вашего и посмотреть что он выдаёт. |
В webpack 5 raw-loader DEPREACTED for v5: please consider migrating to asset modules.
|
Поставил 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 ...' |
- 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 |
В общем заставил ты меня зарыться в это говно: виновата новая суперфича "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:33. |