#webpack #webpack-dev-server #msw
Вопрос:
Я прочитал документацию «Где находится мой» общедоступный » каталог?«.
Общедоступный каталог обычно является корневым каталогом вашего сервера (т. е. ./build, ./public или ./dist). Этот каталог часто привязан к Git, и поэтому он должен быть Фиктивным работником службы.
Я не думаю, что мы должны придерживаться ./dist
Git, когда мы используем webpack для компиляции нашего исходного кода в output.path: './dist'
каталог. Это меня смущает. Я пытаюсь интегрироваться MSW
в браузерную среду.
webpack.config.js
:
const HtmlWebpackPlugin = require("html-webpack-plugin");
const path = require("path");
module.exports = {
entry: "./src/index.js",
output: {
path: path.resolve(__dirname, "./dist"),
filename: "index_bundle.js",
},
mode: "development",
plugins: [new HtmlWebpackPlugin({ template: "./src/index.html" })],
devServer: {
static: {
directory: path.join(__dirname, "dist"),
},
port: 9000,
},
module: {
rules: [
{
test: /.m?js$/,
exclude: /node_modules/,
use: {
loader: "babel-loader",
options: {
presets: ["@babel/preset-env"],
},
},
},
],
},
};
src/index.js
:
window.onload = function () {
console.log(process.env.NODE_ENV);
if (process.env.NODE_ENV === "development") {
const { worker } = require("./mocks/browser");
worker.start();
}
fetch("https://jsonplaceholder.typicode.com/users/1")
.then((res) => res.json())
.then((res) => {
console.log(res);
});
};
src/index.html
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
</body>
</html>
src/mocks/browser.js
:
import { setupWorker } from "msw";
import { handlers } from "./handlers";
export const worker = setupWorker(...handlers);
src/mocks/handlers.js
:
import { rest } from "msw";
export const handlers = [
rest.get("https://jsonplaceholder.typicode.com/users/1", (req, res, ctx) => {
return res(ctx.status(200), ctx.json({ username: "teresa teng" }));
}),
];
То, что я попробовал ниже двумя способами, оба из них работают, когда я использую npx webpack serve
команду для запуска сервера разработки webpack и доступа к своему приложению. Я получил правильный насмешливый ответ.
Сгенерировать mockServiceWorker.js
файл в ./src/
каталоге:
⚡ npx msw init ./src
Перезаписать package.json
с помощью приведенного ниже содержимого
"msw": {
"workerDirectory": "src"
}
Создайте ./dist
каталог и mockServiceWorker.js
файл в ./dist/
каталоге.
⚡ npx msw init ./dist
Но, ./dist/
каталог в .gitignore
файле, который не будет зафиксирован в Git.
webpack-dev-server
не записывает никаких выходных файлов после компиляции. Вместо этого он хранит файлы пакетов в памяти. Это означает ./dist
, что до msw
того, как CLI создаст его, реального каталога не существует. Кроме того, ./dist
файл может быть удален в будущем для повторной компиляции.
Итак, при webpack-dev-server
таком использовании каким должен MSW
быть инициализированный общедоступный каталог?
Ответ №1:
При использовании пользовательской настройки сервера, такой как WDS, часто есть возможность указать серверу, какой локальный каталог использовать для обслуживания статических ресурсов.
В случае с WDS это devServer.static.directory
вариант. Он должен указывать на ваш локальный каталог, созданный вами в качестве общедоступного каталога вашего веб-сайта.
$ mkdir public
$ msw init ./public
// webpack.config.js
const path = require('path')
module.exports = {
devServer: {
static: {
// Point to the directory you've created.
directory: path.resolve(__dirname, 'public')
},
port: 9000
}
}
Вы также можете указать на любой другой существующий каталог, в котором вы решите разместить рабочий сценарий.
Убедитесь, что рабочий сценарий обслуживается правильно, перейдя к http://localhost:9000/mockServiceWorker.js
файлу сценария и просмотрев его содержимое.