webpack加载不了样式

今天碰到一个问题,花费了很久的时间,最后在肖神garychang的帮助下解决了。

问题是打开localhost:8080没有加载出样式


因为我的项目目录结构不对,也就是index.html放的位置不对。

当然这只是表象。

以下面这个目录结构为例子进行讲解


项目目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
online-talk
app
config.json
main.css
main.js
Greeter.js

node_modules


public
bundle.js
index.html

package.json

postcss.config.js

webpack.config.js

可以看到public/index.html

1
2
3
4
5
6
7
8
9
10
11
12
13

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>online-talk</title>
</head>
<body>
<!--<div id='root'>-->
<!--</div>-->
<script src="bundle.js"></script>
</body>
</html>

通过public/index.html来加载bundle.js


其实默认情况下index.html是需要放在项目根目录下的,也就是online-talk

那如何让index.html在public下呢

需要在devserver中设置contentBase: “./public”

devserver作为webpack配置选项中的一项,具有以下配置选项

contentBase

默认webpack-dev-server会为根文件夹提供本地服务器,如果想为另外一个目录下的文件提供本地服务器,应该在这里设置其所在目录(本例设置到“public”目录)

port

设置默认监听端口,如果省略,默认为”8080“

inline

设置为true,当源文件改变时会自动刷新页面

colors

设置为true,使终端输出的文件为彩色的

historyApiFallback

在开发单页应用时非常有用,它依赖于HTML5 history API,如果设置为true,所有的跳转将指向index.html


然而仅仅是设置 contentBase: “./public” ,执行npm start,依然没有样式

因为启动脚本中也需要配置目录
因为启动脚本中也需要配置目录
因为启动脚本中也需要配置目录

"scripts": {
    "start": "webpack-dev-server --inline --content-base public/ --history-api-fallback"
  },

最后附上配置文件,也算是备份

webpack.config.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

var path = require('path');
var webpack = require('webpack');
var autoprefixer = require('autoprefixer');

module.exports = {
devtool: 'eval-source-map',//配置生成Source Maps,选择合适的选项
entry: __dirname + "/app/main.js",//已多次提及的唯一入口文件
output: {
path: __dirname + "/public",//打包后的文件存放的地方
filename: "bundle.js"//打包后输出文件的文件名
},

module: {//在配置文件里添加JSON loader
loaders: [
{
test: /\.json$/,
loader: "json-loader"
},
{
test: /\.js$/,
exclude: /node_modules/,
loader: "babel-loader",
query: {
presets: ['es2015']
}
},
{
test: /\.css$/,
loader: 'style-loader!css-loader!postcss-loader'//添加对样式表的处理
//loader: ['style-loader','css-loader','postcss-loader']//添加对样式表的处理
}
]
},

plugins: [
new webpack.LoaderOptionsPlugin({
options: {
postcss: function () {
return [precss, autoprefixer];
},
devServer: {
contentBase: "./public", //本地服务器所加载的页面所在的目录
port: "8080",
colors: true, //终端中输出结果为彩色
historyApiFallback: true, //不跳转
inline: true //实时刷新
}
}
})
]
}

package.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

{
"name": "online-talk",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "webpack-dev-server --inline --content-base public/ --history-api-fallback"
},
"author": "",
"license": "ISC",
"devDependencies": {
"autoprefixer": "^7.1.0",
"babel-core": "^6.24.1",
"babel-loader": "^7.0.0",
"babel-preset-es2015": "^6.24.1",
"css-loader": "^0.28.1",
"json-loader": "^0.5.4",
"postcss-loader": "^2.0.5",
"style-loader": "^0.17.0",
"webpack": "^2.5.1",
"webpack-dev-server": "^2.4.5"
},
"dependencies": {
"ws": "^2.3.1"
}
}

参考

关注我的微信公众号[李一二],即时看更多的文章