我知道对此有很多问题,但我正在寻找 2 天内 14 小时的解决方案。
我正在尝试为自己建立一个开发环境,但没有热自动更新的运气。
我将 webpack.config 入口点更改为'webpack/hot/dev-server'
. 当我在浏览器上输入该网站时,http://localhost:3000/
我得到了该网站。在控制台中,它说:[HMR] Waiting for update signal from WDS...
但是当我更新某些内容时,页面不会重新加载。什么都没发生。我可以看到 webpack 捕获了更改并更新了包。当我使用 F5 重新加载页面时,我可以看到更改。
当我输入http://localhost/webpack-dev-server/
它时,它会在我进行更改时更新页面。但它会重新加载整页。
我知道这可能是一个简单的解决方案,但相信我,我 14 小时以来一直在努力寻找解决方案。我正在拉我的头发。
我所有的配置都是这样的:
包.json
{
"name": "sample",
"version": "0.1.0",
"description": "sample",
"private": true,
"main": "index.js",
"scripts": {
"start": "cross-env NODE_ENV=development webpack-dev-server --config=./webpack.config.dev.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Gökhan Öztürk",
"license": "ISC",
"devDependencies": {
"autoprefixer": "^6.7.0",
"babel-core": "^6.22.1",
"babel-eslint": "^7.1.1",
"babel-loader": "^6.2.10",
"babel-plugin-add-module-exports": "^0.2.1",
"babel-plugin-dev-expression": "^0.2.1",
"babel-plugin-tcomb": "^0.3.24",
"babel-plugin-webpack-loaders": "^0.8.0",
"babel-polyfill": "^6.22.0",
"babel-preset-env": "^1.1.8",
"babel-preset-react": "^6.22.0",
"babel-preset-react-app": "^2.0.1",
"babel-preset-react-hmre": "^1.1.1",
"babel-preset-react-optimize": "^1.0.1",
"babel-preset-stage-0": "^6.22.0",
"cross-env": "^3.1.4",
"css-loader": "^0.26.1",
"eslint": "^3.14.0",
"eslint-config-airbnb": "^14.0.0",
"eslint-formatter-pretty": "^1.1.0",
"eslint-import-resolver-webpack": "^0.8.1",
"eslint-loader": "^1.6.1",
"eslint-plugin-flowtype": "^2.30.0",
"eslint-plugin-flowtype-errors": "^2.0.3",
"eslint-plugin-import": "^2.2.0",
"eslint-plugin-jsx-a11y": "^3.0.2",
"eslint-plugin-promise": "^3.4.0",
"eslint-plugin-react": "^6.9.0",
"express": "^4.14.0",
"file-loader": "^0.9.0",
"flow-bin": "^0.38.0",
"flow-typed": "^2.0.0",
"html-webpack-plugin": "^2.26.0",
"json-loader": "^0.5.4",
"node-sass": "^4.3.0",
"postcss-loader": "^1.2.2",
"react-hot-loader": "^1.3.1",
"redux-logger": "^2.7.4",
"sass-loader": "^4.1.1",
"style-loader": "^0.13.1",
"tcomb": "^3.2.16",
"url-loader": "^0.5.7",
"webpack": "^1.14.0",
"webpack-dev-middleware": "^1.9.0",
"webpack-dev-server": "^1.16.2",
"webpack-hot-middleware": "^2.15.0"
},
"dependencies": {
"react": "^15.4.2",
"react-dom": "^15.4.2",
"react-redux": "^5.0.2",
"react-router": "^3.0.2",
"react-router-redux": "^4.0.7",
"redux": "^3.6.0",
"redux-thunk": "^2.2.0"
}
}
webpack.config.dev.js
const path = require('path');
const fs = require('fs');
const webpack = require('webpack');
const autoprefixer = require('autoprefixer');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const appDirectory = fs.realpathSync(process.cwd());
function resolveApp(relativePath) {
return path.resolve(appDirectory, relativePath);
}
module.exports = {
debug: true,
devtool: 'inline-sourcemap',
entry: [
'webpack-hot-middleware/client?http://localhost:3000/',
'webpack/hot/only-dev-server',
'babel-polyfill',
'./src/index'
],
output: {
path: resolveApp('build'),
pathinfo: true,
filename: 'static/js/bundle.js',
publicPath: 'http://localhost:3000/'
},
resolve: {
extensions: ['.js', '.json', '.jsx', '']
},
module: {
// First, run the linter.
// It's important to do this before Babel processes the JS.
preLoaders: [
{
test: /\.(js|jsx)$/,
loader: 'eslint',
include: resolveApp('src'),
}
],
loaders: [
// Diğer loaderlar tarafından işlem görmeyecek her dosya buradan yönlendirilecek.
{
exclude: [
/\.html$/,
/\.(js|jsx)$/,
/\.css$/,
/\.(scss|sass)$/,
/\.json$/,
/\.svg$/
],
loader: 'url',
query: {
limit: 10000,
name: 'static/media/[name].[hash:8].[ext]'
}
},
{
test: /\.css$/,
loader: 'style!css?importLoaders=1!postcss'
},
{
test: /\.(scss|sass)$/,
loader: 'style!css?importLoaders=1!postcss!sass'
},
// JSON is not enabled by default in Webpack but both Node and Browserify
// allow it implicitly so we also enable it.
{
test: /\.json$/,
loader: 'json'
},
{
test: /\.(js|jsx)$/,
loader: 'react-hot!babel',
// loader: 'babel?cacheDirectory=true',
include: resolveApp('src'),
exclude: /node_modules/
}
]
},
// We use PostCSS for autoprefixing only.
postcss: function postCssAutoprefixer() {
return [
autoprefixer({
browsers: [
'>1%',
'last 4 versions',
'Firefox ESR',
'not ie < 9', // React doesn't support IE8 anyway
]
}),
];
},
plugins: [
// Generates an `index.html` file with the <script> injected.
new HtmlWebpackPlugin({
inject: true,
template: resolveApp('public/index.html'),
}),
new webpack.optimize.OccurenceOrderPlugin(),
new webpack.HotModuleReplacementPlugin(),
new webpack.NoErrorsPlugin(),
new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify('development')
})
],
devServer: {
hot: true,
contentBase: './src',
port: 3000
},
node: {
fs: 'empty',
net: 'empty',
tls: 'empty'
}
};
.babelrc
{
"presets": [
"react",
"es2015"
],
"plugins": ["add-module-exports"],
"env": {
"production": {
"presets": ["react-optimize"],
"plugins": ["babel-plugin-dev-expression"]
},
"development": {
"plugins": [
"transform-class-properties",
"transform-es2015-classes",
"tcomb"
],
"presets": ["react-hmre"]
}
}
}
公共/index.html
<!doctype html>
<html lang="tr">
<head>
<title>site</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<div id="root"></div>
</body>
</html>