BlueprintJS的最小Webpack 2设置不会加载CSS

时间:2017-04-21 14:53:28

标签: reactjs typescript webpack webpack-2 blueprintjs

我正在尝试创建一个简单的webpack 2设置来试验BlueprintJS和TypeScript。我认为我很接近,但CSS没有正确加载。

以下是此项目的目录结构

  • 的src /
    • index.tsx
    • App.tsx
    • App.css
  • 的index.html
  • 的package.json
  • tsconfig.json
  • webpack.config.js

App.tsx目前包含一个应显示刷新图标的Button组件。当我运行npm run build时,webpack表示已加载样式。但是,当我运行npm run start并查看应用程序时,该按钮没有图标,也没有其他CSS样式。

我一定是做错了。谁能发现它?所有文件的来源包括在下面。如果你能弄清楚当app.tsx中的Button文本发生变化时webpack-dev-server不会重新编译的原因,你可以获得奖励积分。欢迎提出其他建议。

index.tsx

import * as React from 'react';
import * as ReactDOM from 'react-dom';
import App from './App';

ReactDOM.render(
  <App />,
  document.getElementById('root')
);

App.tsx

import * as React from "react";
import { Button } from "@blueprintjs/core";
import './App.css';

export class App extends React.Component<{}, {}> {
     public render(): JSX.Element {
        return (
                <Button iconName="refresh" text="Refresh"/>
        );
    }
}
export default App;

App.css

@import "@blueprintjs/core/dist/blueprint.css";

的index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <title>BlueprintJS Test</title>
</head>
<body>
    <div id="root"></div>
    <script src="./node_modules/react/dist/react.js"></script>
    <script src="./node_modules/react-dom/dist/react-dom.js"></script>
    <script type="text/javascript" src="./dist/bundle.js"></script>
</body>
</html>

的package.json

{
  "name": "blueprintplay",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "scripts": {
    "build": "webpack",
    "start": "webpack-dev-server"
  },
  "dependencies": {
    "@blueprintjs/core": "^1.14.0",
    "classnames": "^2.2.5",
    "react": "^15.4.2",
    "react-addons-css-transition-group": "^15.4.2",
    "react-dom": "^15.4.2"
  },
  "devDependencies": {
    "@types/classnames": "^0.0.32",
    "@types/pure-render-decorator": "^0.2.27",
    "@types/react": "^15.0.18",
    "@types/react-addons-css-transition-group": "^15.0.1",
    "@types/react-dom": "^0.14.23",
    "case-sensitive-paths-webpack-plugin": "^2.0.0",
    "css-loader": "^0.28.0",
    "file-loader": "^0.11.1",
    "source-map-loader": "^0.2.0",
    "style-loader": "^0.16.1",
    "ts-loader": "^2.0.3",
    "typescript": "^2.2.2",
    "url-loader": "^0.5.8",
    "webpack": "^2.4.1",
    "webpack-dev-server": "^2.4.2"
  }
}

tsconfig.json

{
  "compilerOptions": {
    "outDir": "./dist/",
    "sourceMap": true,
    "module": "commonjs",
    "target": "es5",
    "jsx": "react"
  },
  "include": [
    "src/**/*"
  ],
  "exclude": [
    "node_modules",
    "**/*.spec.ts"      
  ]
}

webpack.config.js

const path = require('path');

module.exports = {
  entry: [
    './src/index.tsx'
  ],
  output: {
    filename: 'bundle.js',
    path: __dirname + "/dist"
  },
  module: {
    rules: [
      {
        enforce: 'pre',
        test: /\.js$/,
        loader: "source-map-loader"
      },
      {
        test: /\.tsx?$/,
        use: "ts-loader"
      },
     {
        test: /\.css$/,
        use: [
          {
            loader: 'style-loader',
          },
          {
            loader: 'css-loader',
            options: {
              modules: true,
            },
          },
        ],
      },
      {
        test: /\.(woff|woff2)$/,
        use: {
          loader: 'url-loader',
          options: {
            name: 'fonts/[hash].[ext]',
            limit: 5000,
            mimetype: 'application/font-woff'
          }
        }
      }, 
      {
        test: /\.(ttf|eot|svg)$/,
        use: {
          loader: 'file-loader',
          options: {
            name: 'fonts/[hash].[ext]'
          }
        }
      },
    ]
  },
  resolve: {
    extensions: [".tsx", ".ts", ".js"]
  },
  devtool: 'source-map',
  devServer: {
    host: process.env.HOST, // Defaults to `localhost`
    port: process.env.PORT, // Defaults to 8080
    hot: true,
  }, 
  externals: {
    "react": "React",
    "react-dom": "ReactDOM"
  },
  stats: "verbose",
};

1 个答案:

答案 0 :(得分:4)

您正在使用CSS modules将每个类更改为本地标识符,您需要引用正确的标识符。但是因为它是一个在元素上设置类的库,例如在你正在使用的按钮上,所以它不适用于CSS模块,所以你需要在css-loader中关闭它们。您可以删除该选项,因为默认情况下它们已关闭。

{
  test: /\.css$/,
  use: [
    {
      loader: 'style-loader',
    },
    {
      loader: 'css-loader',
    },
  ],
},

禁用CSS模块后,您还需要更改CSS中的导入,因为它被视为相对路径。 Webpack允许您使用~启动路径,以指示应将其解析为模块而不是相对路径。

@import "~@blueprintjs/core/dist/blueprint.css";