Не могу разрешить 'fs' с помощью веб-пакета и реагировать
Я продолжаю получать сообщение об ошибке в описании, когда пытаюсь создать приложение для моего Node-сервера.
В конечном итоге я пытаюсь прочитать файл.docx для docxtemplater, но без работы 'fs' он не выглядит ярким.
Я попытался использовать обходной путь узла:{fs:"empty"}, который я видел во многих решениях, но он все еще дает мне ту же ошибку или распространяется на консоль, когда я запускаю ее в браузере.
Вот что у меня есть в моем webpack.config.js:
var path = require('path');
var webpack = require('webpack');
//var HtmlWebpackPlugin = require('html-webpack-plugin');
var UglifyJsPlugin = require('uglifyjs-webpack-plugin');
var DashboardPlugin = require('webpack-dashboard/plugin');
const sourcePath = path.join(__dirname, './front_end');
const buildPath = path.join(__dirname, './src/bin');
module.exports = {
devtool: 'source-map',
//home directory for webpack must be absolute
//context: sourcePath,
//Application Execution and Webpack Bundling
entry: {
js: path.join(sourcePath, 'index.js')
//html: './index.html',
},
output: {
//Must be absolute path
path: sourcePath,
//publicPath: buildPath,
//publicPath: path.join(__dirname, '/src/bin'),
filename: "bundle.js"
},
resolve: {
extensions: [
'.webpack-loader.js',
'.web-loader.js',
'.loader.js',
'.js',
'.jsx'
],
modules: [
path.join(__dirname),
"node_modules"
],
},
module: {
rules: [
{
test: /\.js$|\.jsx$/,
exclude: /node_modules/,
use: [
"babel-loader",
"eslint-loader",
]
},
{
test: /\.html/,
exclude: /node_modules/,
use: [
"file-loader",
]
},
{
test: /\.css/,
exclude: /node_modules/,
use: [
"style-loader",
'css-loader'
]
},
{
test: /\.(gif|png)/,
exclude: /node_modules/,
use: [
"url-loader"
]
}
],
loaders: [
{
test: /\.js$|\.jsx$/,
loader: 'babel-loader',
exclude: /node_modules/,
query: {
presets: ['es2016', 'react']
}
},
{
test: /\.css$/,
loader: 'style-loader',
use: ['style-loader', 'css-loader'],
exclude: /node_modules/
},
{
test: /\.html$/,
loader: "file?name=[name].[ext]"
},
{
test: /\.(jpe?g|png|gif|svg)$/i,
loaders: [
'file?hash=sha512&digest=hex&name=[hash].[ext]',
'image-webpack?bypassOnDebug&optimizationLevel=7&interlaced=false'
]
}
]
},
plugins: [
],
stats: {
assets: true,
colors: true,
errors: true,
errorDetails: true,
hash: true,
}
};
4 ответа
Вы не можете использовать любые модули, которые поставляются с Node Core API в браузере, они просто не будут работать там. Модули Node Core используют двоичные файлы C/C++, которые не будут присутствовать в браузере. Так что вам нужно найти эквивалентный подход к замене любого fs
использовать в своем приложении реакции.
Один из подходов состоит в том, чтобы передать файл, с которым вы хотите работать, через HTTP через серверную часть Node JS в ваше приложение React. Вы можете прочитать файл, используя fs
на сервере Node и поместите эту логику в маршрут, вызовите этот маршрут из приложения React через HTTP и отправьте его обратно. Тогда у вас будут данные файла в вашем приложении React, и вы сможете работать с ним по мере необходимости.
В этом репозитории GitHub есть список библиотек Node Core, которые Webpack перенес для использования в браузерах. к несчастью fs
не один из них.
Добавить в package.json
"browser": {
"crypto": false,
"fs": false,
"path": false,
"os": false,
"net": false,
"stream": false,
"tls": false
},
Добавьте в webpack:
node: { fs: 'empty' },
devtool: options.devtool,
target: 'web', // Make web variables accessible to webpack, e.g. window
Я опаздываю, но это специфично для docxtemplater.
Чтобы загрузить docx, вы используете fs
в узле, и JSZipUtils.getBinaryContent
в браузере.
Посмотрите эту демонстрацию (отсюда: http://docxtemplater.readthedocs.io/en/latest/generate.html)
<html>
<script src="docxtemplater.js"></script>
<script src="jszip.js"></script>
<script src="vendor/file-saver.min.js"></script>
<script src="vendor/jszip-utils.js"></script>
<!--
Mandatory in IE 6, 7, 8 and 9.
-->
<!--[if IE]>
<script type="text/javascript" src="examples/vendor/jszip-utils-ie.js"></script>
<![endif]-->
<script>
function loadFile(url,callback){
JSZipUtils.getBinaryContent(url,callback);
}
loadFile("examples/tag-example.docx",function(error,content){
if (error) { throw error };
var zip = new JSZip(content);
var doc=new Docxtemplater().loadZip(zip)
doc.setData({
first_name: 'John',
last_name: 'Doe',
phone: '0652455478',
description: 'New Website'
});
try {
// render the document (replace all occurences of {first_name} by John, {last_name} by Doe, ...)
doc.render()
}
catch (error) {
var e = {
message: error.message,
name: error.name,
stack: error.stack,
properties: error.properties,
}
console.log(JSON.stringify({error: e}));
// The error thrown here contains additional information when logged with JSON.stringify (it contains a property object).
throw error;
}
var out=doc.getZip().generate({
type:"blob",
mimeType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
}) //Output the document using Data-URI
saveAs(out,"output.docx")
})
</script>
</html>
для меня это происходило потому, что я импортировал код внешнего интерфейса для анализа некоторых переменных из него (используя «tailwindcss/resolveConfig»). Поскольку в моей конфигурации были плагины, которые импортировалиfs
- Я получил эту ошибку. Поэтому я просто разделил чистые данные конфигурации и код плагинов. И мойtailwind.config.js
теперь импортирует и объединяет оба (данные + плагины), а приложение JS импортирует только файл данных (без плагинов, которые используют запрещенные зависимости)