Skip to content

How to use Bootstrap 4 and Sass (and jQuery)#215

@alvipeo

Description

@alvipeo

ok, I'm not a pro neither in webpack nor any of these new shiny 0.x.x version tech YET, so... But just in case someone would need it, here's how I got Bootstrap 4 (alpha now) + sass working:

  1. npm install bootstrap-loader --save
  2. npm install jquery --save
  3. npm install [email protected] --save
  4. npm install css-loader node-sass resolve-url-loader sass-loader style-loader url-loader --save-dev
  5. Added autoprefixer to web.config.js (to use with postcss - optional):
 const autoprefixer = require('autoprefixer'); postcss: [autoprefixer], // this is inside module.exports object 
  1. Add loaders to webpack.config.js:
{test: /\.scss$/, loaders: ['style', 'css', 'postcss', 'sass'] },{test: /\.(woff2?|ttf|eot|svg)$/, loader: 'url?limit=10000' }, // Bootstrap 4{test: /bootstrap\/dist\/js\/umd\//, loader: 'imports?jQuery=jquery' } 
  1. Add jQuery plugin to webpack.config.js (to plugins array):
 new ProvidePlugin({jQuery: 'jquery', $: 'jquery', jquery: 'jquery' }) 
  1. Add to the end of vendor.ts:
 import 'jquery'; import 'bootstrap-loader'; 
  1. Add some Bootstrap markup to your home.html to see that it works

Resulting webpack.config.js:

// @AngularClass /* * Helper: root(), and rootDir() are defined at the bottom */ var path = require('path'); // Webpack Plugins var ProvidePlugin = require('webpack/lib/ProvidePlugin'); var DefinePlugin = require('webpack/lib/DefinePlugin'); var CommonsChunkPlugin = require('webpack/lib/optimize/CommonsChunkPlugin'); var CopyWebpackPlugin = require('copy-webpack-plugin'); var HtmlWebpackPlugin = require('html-webpack-plugin'); var ENV = process.env.ENV = process.env.NODE_ENV = 'development'; const autoprefixer = require('autoprefixer'); var metadata ={title: 'IlgGallery UI', baseUrl: '/', host: '192.168.1.2', port: 3000, ENV: ENV }; /* * Config */ module.exports ={// static data for index.html metadata: metadata, // for faster builds use 'eval' devtool: 'source-map', debug: true, entry:{'vendor': './src/vendor.ts', 'main': './src/main.ts' // our angular app }, // Config for our build files output:{path: root('dist'), filename: '[name].bundle.js', sourceMapFilename: '[name].map', chunkFilename: '[id].chunk.js' }, resolve:{// ensure loader extensions match extensions: ['', '.ts', '.js', '.json', '.css', '.html'] }, module:{preLoaders: [{test: /\.ts$/, loader: 'tslint-loader', exclude: [/node_modules/] }], loaders: [ // Support for .ts files.{test: /\.ts$/, loader: 'ts-loader', query:{'ignoreDiagnostics': [ 2403, // 2403 -> Subsequent variable declarations 2300, // 2300 -> Duplicate identifier 2374, // 2374 -> Duplicate number index signature 2375 // 2375 -> Duplicate string index signature ] }, exclude: [/\.(spec|e2e)\.ts$/, /node_modules\/(?!(ng2-.+))/] }, // Support for *.json files.{test: /\.json$/, loader: 'json-loader' }, // Support for CSS as raw text{test: /\.css$/, loader: 'raw-loader' }, // support for .html as raw text{test: /\.html$/, loader: 'raw-loader' }, // if you add a loader include the resolve file extension above{test: /\.scss$/, loaders: ['style', 'css', 'postcss', 'sass'] },{test: /\.(woff2?|ttf|eot|svg)$/, loader: 'url?limit=10000' }, // Bootstrap 4{test: /bootstrap\/dist\/js\/umd\//, loader: 'imports?jQuery=jquery' } ] }, // sassResources: path.resolve(__dirname, "./node_modules/bootstrap/scss"), postcss: [autoprefixer], plugins: [ new CommonsChunkPlugin({name: 'vendor', filename: 'vendor.bundle.js', minChunks: Infinity }), // static assets new CopyWebpackPlugin([{from: 'src/assets', to: 'assets' }]), // generating html new HtmlWebpackPlugin({template: 'src/index.html', inject: false }), // replace new DefinePlugin({'process.env':{'ENV': JSON.stringify(metadata.ENV), 'NODE_ENV': JSON.stringify(metadata.ENV) } }), new ProvidePlugin({jQuery: 'jquery', $: 'jquery', jquery: 'jquery' }) ], // Other module loader config tslint:{emitErrors: false, failOnHint: false }, // our Webpack Development Server config devServer:{port: metadata.port, host: metadata.host, historyApiFallback: true, watchOptions:{aggregateTimeout: 300, poll: 1000 } }, // we need this due to problems with es6-shim node:{global: 'window', progress: false, crypto: 'empty', module: false, clearImmediate: false, setImmediate: false } }; // Helper functions function root(args){args = Array.prototype.slice.call(arguments, 0); return path.join.apply(path, [__dirname].concat(args))} function rootNode(args){args = Array.prototype.slice.call(arguments, 0); return root.apply(path, ['node_modules'].concat(args))} 

I haven't changed webpack.prod.config.js so authors could help us out here please.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions