Импорт веб-пакетов из% appdata% - PullRequest
2 голосов
/ 30 января 2020

У меня есть электронное приложение, которому нужно прочитать файл, сохраненный в %appdata% (или эквивалент для macOS и linux). Я импортирую файл следующим образом:

const appPath = app.getPath("appData");
const data = await import(appPath + "/app/file.json");

Если я запускаю код из исходного файла, он работает, но когда я пытаюсь связать его с веб-пакетом, я получаю ошибку Module not found. Я знаю, что это вызвано тем, что webpack пытается выполнить анализ моего импорта.

Так есть ли способ динамически импортировать файл в webpack?

Заранее спасибо!

Редактировать: мой конфиг веб-пакета (без babel, поскольку я использую машинопись)

  var path = require("path");
const CopyPlugin = require('copy-webpack-plugin');
var nodeExternals = require('webpack-node-externals');

module.exports = {
    mode: 'production',
    entry: "./src/index.ts",
    externals: [nodeExternals()],
    output: {
        filename: "main.js",
        path: path.resolve(__dirname, 'build')
    },
    node:{
        __dirname:false
    },
    target: "electron-main",
    resolve: {
        alias: {
            ['firebase/app']: path.resolve(__dirname, 'node_modules/firebase/app/dist/index.cjs.js'),
            ['firebase']: path.resolve(__dirname, 'node_modules/firebase/dist/index.node.cjs.js')
        }, extensions: ['.ts', '.js']
    },
    module: {
        noParse: "/public/**/*",
        rules: [
            {
                test: /\.tsx?$/,
                use: 'ts-loader',
                exclude: /node_modules/,
            },
            // {
            //     test: /\.json$/,
            //     loader: 'json-loader'
            // }
        ],
    },
    plugins: [
        new CopyPlugin([
            { from: './src/public', to: './public' }
        ]),
    ]
 }

Ответы [ 3 ]

1 голос
/ 04 февраля 2020

При просмотре документации кажется, что ответ находится в Методы модуля раздел:

Dynami c выражений в import ()

Невозможно использовать полностью динамический оператор импорта c, такой как import(foo). Поскольку foo потенциально может быть любым путем к любому файлу в вашей системе или проекте.

import() должен содержать хотя бы некоторую информацию о том, где находится модуль. [...]

Непонятно, нужно ли читать его во время сборки или во время выполнения, если это первое, то обязательно скопируйте файл в рабочий каталог (чтобы этот файл был в сборке), если он последний, то вы можете использовать модуль fs для получения файла во время выполнения.

0 голосов
/ 04 февраля 2020

Я думаю, вы не можете, но NormalModuleRpelacementPlugin может быть решением вашей проблемы. Вы можете использовать его во время сборки, однако это может зависеть, например, от окружения.

Путь к файлу такой же в коде, но после сборки он будет изменен так, как вы захотите.

https://webpack.js.org/plugins/normal-module-replacement-plugin/

0 голосов
/ 04 февраля 2020

Может быть, вы можете попробовать динамический c импорт и использовать такие обещания, как это

import(appPath + "/app/file.json").then(data => {
   console.log(data)
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...