我已經洗掉了 CRA 并自行配置了 webpack/babel。現在我有動態匯入的問題。
這很好用:
import("./" "CloudIcon" ".svg")
.then(file => {
console.log(file);
})
這不起作用:
const name = 'CloudIcon';
import("./" name ".svg")
.then(file => {
console.log(file);
})
我嘗試匯出不同型別的檔案。它沒有用。曾嘗試使用 Webpack Magic Comments,但也無濟于事。
我想,我的 webpack/babel 設定有問題,但是什么?
babel.config.js:
const plugins = [
"@babel/syntax-dynamic-import",
["@babel/plugin-transform-runtime"],
"@babel/transform-async-to-generator",
"@babel/plugin-proposal-class-properties"
];
if (process.env.NODE_ENV === 'development') {
plugins.push('react-refresh/babel');
}
module.exports = {
presets: [[
"@babel/preset-env", {
"debug": false,
"modules": false,
"useBuiltIns": false
}],
['@babel/preset-react', {throwIfNamespace: false}],
'@babel/preset-typescript'
],
plugins,
};
webpack.config.js:
require('dotenv').config();
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin');
const webpack = require('webpack');
const reactAppVars = (() => {
const obj = {};
for (let key in process.env) {
if (key.startsWith('REACT_APP_')) obj[key] = process.env[key];
}
return obj;
})();
const target = process.env['NODE_ENV'] === 'production' ? 'browserslist' : 'web';
const plugins = [
new webpack.EnvironmentPlugin({'NODE_ENV': process.env['NODE_ENV'], 'PUBLIC_URL': '', ...reactAppVars}),
new HtmlWebpackPlugin({template: path.resolve(__dirname, '../public/index.html')}),
new MiniCssExtractPlugin({filename: '[name].[contenthash].css'}),
new webpack.ProvidePlugin({process: 'process/browser'}),
new webpack.ProvidePlugin({"React": "react"}),
];
if (process.env['SERVE']) plugins.push(new ReactRefreshWebpackPlugin());
const proxy = {
//Proxy settings
}
module.exports = {
entry: "./src/index.js",
output: {
filename: "main.js",
path: path.resolve(__dirname, "../build"),
assetModuleFilename: '[path][name].[ext]'
},
plugins,
devtool: 'source-map',
devServer: {
static: {
directory: path.resolve(__dirname, "../public"),
},
proxy,
port: 9999,
hot: true,
},
module: {
rules: [
{ test: /\.(html)$/, use: ['html-loader'] },
{
test: /\.(s[ac]|c)ss$/i,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
'postcss-loader',
'sass-loader'
]
},
{
test: /\.less$/i,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
'postcss-loader',
{
loader: 'less-loader',
options: {
lessOptions: {
javascriptEnabled: true
}
}
}
]
},
{
test: /\.(png|jpe?g|gif|webp|ico)$/i,
type: process.env['NODE_ENV'] === 'production' ? 'asset' : 'asset/resource'
},
{
test: /\.svg$/i,
issuer: /\.[jt]sx?$/,
use: ['@svgr/webpack', {
loader: 'file-loader',
options: {
name: '[path][name].[ext]'
}
}],
},
{
test: /\.(woff2?|eot|ttf|otf)$/i,
type: process.env['NODE_ENV'] === 'production' ? 'asset' : 'asset/resource'
},
{
test: /\.jsx?$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
cacheDirectory: true,
}
}
},
{
test: /\.([cm]?ts|tsx)$/,
use: {
loader: "babel-loader",
options: {
presets: [
"@babel/preset-env",
"@babel/preset-react",
"@babel/preset-typescript",
]
}
}
},
{
test: /\.md$/,
loader: "raw-loader"
},
],
},
resolve: {
'roots': [path.resolve('./src')],
'extensions': ['', '.js', '.jsx', '.ts', '.tsx'],
extensionAlias: {
".js": [".js", ".ts"],
".cjs": [".cjs", ".cts"],
".mjs": [".mjs", ".mts"]
},
fallback: {
'process/browser': require.resolve('process/browser')
}
},
mode: process.env['NODE_ENV'],
target
}
uj5u.com熱心網友回復:
當您定義了匯入路徑時,webpack 會將該代碼包含在已經存在的塊中,這基本上會發生什么。當您進行動態匯入(轉換為正則運算式)時,它將獲取與此正則運算式對應的所有檔案并將它們放在不同的塊中。
很難從細節中確定您是否提供這些額外的塊并且瀏覽器可以訪問它們。網路和服務器日志是一個好的開始。
https://webpack.js.org/guides/code-splitting/#prefetchingpreloading-modules
uj5u.com熱心網友回復:
問題是 webpack 中的擴展陣列
'extensions': ['', '.js', '.jsx', '.ts', '.tsx']
我改成了這個
'extensions': ['.js', '.jsx', '.ts', '.tsx', '...']
現在一切正常。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/535384.html