Ts-loader / webpack - как разрешить файлы вне рабочей папки с помощью webpack - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть проект, который является расширением кода против, но я думаю, что это не слишком важно.

У меня есть следующая структура:

./package.json
./tsconfig.json --> references [ ./client, ./server, ./interfaces]

./client
   package.json
   tsconfig.json
   webpack.config.js
./server
   package.json
   tsconfig.json
   webpack.config.js
./interfaces
   package.json
   tsconfig.json

импорт клиента и сервера из проекта интерфейсов, который просто содержит некоторые типы, интерфейсы, перечисления, пространства имен и т. д. c, которые совместно используются обоими. Что бы это ни стоило, мне все равно, если webpack дублирует это и в клиентский пакет. js и в сервер. js, но я не хочу скопировать / вставить код между ними.

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

TS2769: перегрузка не соответствует этому вызову. Перегрузка 1 из 3, '(тип: RequestType0 <{}, неизвестно, неизвестно>, обработчик: RequestHandler0 <{}, неизвестно>): void', вызвала следующую ошибку. Аргумент типа 'RequestType' не может быть назначен параметру типа 'RequestType0 <{}, unknown, unknown>'. Типы свойств '_' несовместимы. Введите '[MyType, MyOtherType, void, void, _EM] | undefined 'нельзя назначить типу' [{}, неизвестно, неизвестно, _EM] | не определено. Тип '[MyType, MyOtherType, void, void, _EM]' нельзя назначить типу [[{}, unknown, unknown, _EM] '. Типы собственности «3» несовместимы. Тип 'void' нельзя назначить типу '_EM'. Перегрузка 2 из 3, '(тип: RequestType, обработчик: RequestHandler): void', выдало следующую ошибку. Аргумент типа «RequestType» не может быть назначен параметру типа «RequestType». Типы имеют отдельные объявления частной собственности _method. Перегрузка 3 из 3, '(метод: string, handler: GenericRequestHandler <{}, unknown>): void', вызвала следующую ошибку. Аргумент типа 'RequestType' не может быть назначен параметру типа 'string'.

Кажется, что он не может правильно обрабатывать вещи внутри интерфейсов.

Мой конфиг веб-пакета выглядит вот так (они примерно одинаковы, за исключением имен файлов):

// ./shared.webpack.config.js
const path = require('path');
const merge = require('merge-options');

module.exports = function withDefaults(/**@type WebpackConfig*/extConfig) {

    /** @type WebpackConfig */
    let defaultConfig = {
        mode: 'none', // this leaves the source code as close as possible to the original (when packaging we set this to 'production')
        target: 'node', // extensions run in a node context
        node: {
            __dirname: false // leave the __dirname-behaviour intact
        },
        resolve: {
            mainFields: ['module', 'main'],
            extensions: ['.ts', '.js'] // support ts-files and js-files
        },
        module: {
            rules: [{
                test: /\.ts$/,
                exclude: /node_modules/,
                use: [{
                    // configure TypeScript loader:
                    // * enable sources maps for end-to-end source maps
                    loader: 'ts-loader',
                    options: {
                        compilerOptions: {
                            "sourceMap": true,
                        }
                    }
                }]
            }]
        },
        externals: {
            'vscode': 'commonjs vscode', // ignored because it doesn't exist
        },
        output: {
            // all output goes into `dist`.
            // packaging depends on that and this must always be like it
            filename: '[name].js',
            path: path.join(extConfig.context, 'out'),
            libraryTarget: "commonjs",
        },
        // yes, really source maps
        devtool: 'source-map'
    };

    return merge(defaultConfig, extConfig);
};

I borrowed these webpack configurations from a similar VS Code extension, although the original extension did not use an `interfaces` project, they just duplicated all the code.

I'm a webpack newbie; how should I modify these configurations to process the interfaces?
// ./client/webpack.config.js
const withDefaults = require('../shared.webpack.config');
const path = require('path');

module.exports = withDefaults({
  context: path.join(__dirname),
  entry: {
    extension: './src/extension.ts',
  },
  output: {
    filename: 'extension.js',
    path: path.join(__dirname, 'out')
  }
});

edit: если я явно добавлю блок include в общую конфигурацию webpack для всех 3 папок, я получу другая ошибка, говорящая о том, что типы нельзя назначать, потому что типы ссылаются на другой сторонний пакет, поэтому технически существует два экземпляра этого пакета:

Типы имеют отдельные объявления частного свойства '_method' .

...