#javascript #node.js #reactjs #express #webpack
#javascript #node.js #reactjs #экспресс #webpack
Вопрос:
Я работаю над надстройкой Outlook, у меня запущен сервер Express. Я устанавливаю webpack, потому что мне нужно перенести js в es5, чтобы он работал в Outlook Desktop. Вот упрощенная структура проекта.
/public
/javascripts
ssoAuth.js
/addin
/commmands
commands.js
commands.html
/server
/bin
/helpers
app.js
Общая папка установлена как статическая папка на моем экспресс-сервере
app.use(express.static(path.join(__dirname, '../public'),
Моя проблема в commands.js Я импортирую ssoAuth.js с помощью импорта модуля es6 с относительным путем :
import getGraphAccessToken from "/javascripts/ssoAuthES6.js";
Он отлично работает, когда я запускаю узел. /server/app.js и загрузите мой надстройку Outlook, но когда я хочу использовать Webpack для связывания, импорт не работает, я получаю :
ERROR in ./addin/commands/commands.js
Module not found: Error: Can't resolve '/javascripts/ssoAuth.js'
Я не могу понять, как настроить webpack, чтобы разрешить импорт из общей папки.
Вот мои файлы конфигурации webpack :
webpack.config.js :
const config = {
devtool: "source-map",
entry: {
polyfill: "@babel/polyfill",
commands: "./addin/commands/commands.js"
},
resolve: {
extensions: [".ts", ".tsx", ".html", ".js"]
},
module: {
rules: [
{
test: /.js$/,
exclude: /node_modules/,
use: {
loader: "babel-loader",
options: {
presets: ["@babel/preset-env"]
}
}
},
{
test: /.html$/,
exclude: /node_modules/,
use: "html-loader"
},
{
test: /.(png|jpg|jpeg|gif)$/,
use: "file-loader"
}
]
},
plugins: [
new CleanWebpackPlugin(),
new HtmlWebpackPlugin({
filename: "commands.html",
template: "./addin/commands/commands.html",
chunks: ["polyfill", "commands"]
})
]};
webpack.server.config.js :
return ({
entry: {
server: './server/bin/www',
},
output: {
path: path.join(__dirname, 'dist'),
publicPath: '/',
filename: '[name].js'
},
target: 'node',
node: {
__dirname: false,
__filename: false,
},
externals: [nodeExternals()],
module: {
rules: [
{
// Transpiles ES6-8 into ES5
test: /.js$/,
exclude: /node_modules/,
use: {
loader: "babel-loader"
}
}
]
},
plugins: [
new CopyWebpackPlugin([
{
to: "./public",
from: "./public"
}
])
]})
Можете ли вы помочь разобраться в этом? Есть ли лучшая структура папок, которую я должен использовать, чтобы заставить ее работать?
Спасибо
Ответ №1:
Вы используете абсолютный путь
import getGraphAccessToken from "/javascripts/ssoAuthES6.js";
// ^ this will look in your topmost directory on your OS
Относительный путь, из commands.js
, будет:
import getGraphAccessToken from "../../javascripts/ssoAuthES6.js";
Кроме того, вы можете настроить Webpack на поиск модулей из вашего корневого каталога, добавив в конфигурацию webpack следующее:
{
// ...
resolve: {
modules: [path.resolve(__dirname, "src"), "node_modules"],
},
// ...
}
Затем вы можете импортировать из корневого каталога вашего проекта из любого места, например:
import getGraphAccessToken from "javascripts/ssoAuthES6.js";
Некоторые другие моменты:
- Поскольку вы устанавливаете
extensions: [".ts", ".tsx", ".html", ".js"]
, вам не нужно указывать расширения файлов для этого импорта - Вы указываете
.ts
и.tsx
в своей конфигурации webpack, но используете.js
файлы. Рассмотрите возможность удаления расширений Typescript - Если вы используете Typescript, вам нужно будет обновить пути импорта в вашем
tsconfig.json
- Вы можете использовать псевдонимы путей импорта как в Webpack, так и в Typescript, чтобы более четко указывать, что ваш импорт поступает из корня вашего проекта. Инструкции здесь