如何配置webpack以运行bootstrap和sass?

时间:2016-02-21 21:25:35

标签: twitter-bootstrap reactjs sass webpack

我对webpack不太满意。我还没有真正学会它,我有一个模板/样板我从我制作的回购中提取,这给了我一个在React中构建的环境。我正在努力为我的项目添加引导功能,因为我对webpack并不了解并且了解加载器等的工作方式。有人可以帮我一把吗?也许是关于webpack加载器的简单解释? (在我的名单上学习它,但不是优先考虑的事项。)

我得到奇怪的错误,如:

错误在./~/bootstrap-sass/assets/fonts/bootstrap/glyphicons-halflings-regular.woff2

这是我的webpack.config.js

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


var BUILD_DIR = path.resolve(__dirname, 'src/client/public');
var APP_DIR = path.resolve(__dirname, 'src/client/app');

var config = {
  entry: APP_DIR + '/index.jsx',
  output: {
    path: BUILD_DIR,
    filename: 'bundle.js'
  },
  module : {
    loaders : [
      {
        test : /\.jsx?/,
        include : APP_DIR,
        loader : 'babel'
      },
      {
        test: /\.scss$/,
        loaders: ["style", "css", "sass"]
      }
    ]
  }
};

module.exports = config;

这是我的package.json

{
  "name": "react-camper-leaderboard",
  "version": "1.0.0",
  "description": "freecodecamp leaderboard sorter",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev": "webpack -d --watch",
    "build": "webpack -p"
  },
  "author": "Tim Bell",
  "license": "ISC",
  "dependencies": {
    "babel-loader": "^6.2.2",
    "babel-preset-es2015": "^6.5.0",
    "babel-preset-react": "^6.5.0",
    "bootstrap": "^4.0.0-alpha.2",
    "bootstrap-loader": "^1.0.8",
    "bootstrap-sass": "^3.3.6",
    "css-loader": "^0.23.1",
    "file-loader": "^0.8.5",
    "node-sass": "^3.4.2",
    "react": "^0.14.7",
    "react-dom": "^0.14.7",
    "resolve-url-loader": "^1.4.3",
    "sass-loader": "^3.1.2",
    "style-loader": "^0.13.0",
    "url-loader": "^0.5.7"
  },
  "devDependencies": {
    "css-loader": "^0.23.1",
    "node-sass": "^3.4.2",
    "sass-loader": "^3.1.2",
    "webpack": "^1.12.13"
  },
  "babel": {
    "presets": [
      "es2015",
      "react"
    ]
  }
}

3 个答案:

答案 0 :(得分:26)

结帐example from the sass-loader。您的webpack.config.js应如下所示:

module.exports = {
    ...
    module: {
        loaders: [
            {
                test: /\.woff2?$|\.ttf$|\.eot$|\.svg$/,
                loader: "file"
            },
            {
                test: /\.scss$/,
                loaders: ["style", "css", "sass"]
            }
        ]
    }
};

由于您已添加了一堆加载器,因此应确保已安装所有这些加载器:

npm i file-loader style-loader css-loader sass-loader --save-dev

然后您应该将main.scss作为webpack条目添加到webpack.config.js ...

module.exports = {
   ...
    entry: [
        path.resolve(__dirname, '..', 'path', 'to',  'main.scss'),
        // add other entries
    ],
    ...

...或只是在main.js

中要求/导入它
require("./path/to/main.scss");

由于bootstrap需要配置url()个路径,因此您需要在导入引导程序之前设置$icon-font-path 。您的main.scss应如下所示:

$icon-font-path: "~bootstrap-sass/assets/fonts/bootstrap/";
@import "~bootstrap-sass/assets/stylesheets/bootstrap";

如果您认为@import "~bootstrap-sass/assets/stylesheets/bootstrap";看起来很难看,您还可以为webpack.config.js添加别名:

module.exports = {
   ...
    resolve: {
        alias: {
            "bootstrap-sass$": "bootstrap-sass/assets/stylesheets/bootstrap"
        }
    },

然后你只需要写:

@import "~bootstrap-sass";

答案 1 :(得分:1)

importrequire或以任何其他方式加载的每个扩展程序都必须拥有自己的加载程序。

woff2开始,您可能会添加以下内容:

{
    test: /\.woff2$/,
    loader: 'url',
    query: {
        limit: 10240,
        name: 'static/[hash].[ext]'
    }
}

您可能需要查看url-loader documentation关于它接受的所有参数。

您还可以匹配多个不同的文件名模式以与同一个加载器一起使用,例如:

{
    test: /\.(eot|ttf|svg|png|gif|woff2?$/,
    loader: 'url',
    query: {
        limit: 10240,
        name: 'static/[hash].[ext]'
    }
}

这将加载所有这些扩展。

答案 2 :(得分:0)

./~/bootstrap-sass/assets/fonts/bootstrap/glyphicons-halflings-regular.woff2路径可能有问题。 Bootstrap-sass需要通过sass文件,但webpack找不到它。