Webpack之進階

進階

less與sass

npm install --save-dev less less-loadercss

{
    test: /\.less$/,
    use: [{
           loader: "style-loader" // creates style nodes from JS strings
        }, {
            loader: "css-loader" // translates CSS into CommonJS
        , {
            loader: "less-loader" // compiles Less to CSS
        }]
}

分離html

{
            test: /\.less$/,
            use: extractTextPlugin.extract({
                use: [{
                    loader: "css-loader"
                }, {
                    loader: "less-loader"
                }],
                // use style-loader in development
                fallback: "style-loader"
            })
 }

sass與less相同
npm install --save-dev sass-loader node-sassnode

CSS3前綴處理

postcss

npm install --save-dev postcss-loader autoprefixerreact

postcss須要單獨配置configjquery

postcss.config.js 與 webpack.config.js 同級webpack

module.exports = {
    plugins: [
        require('autoprefixer')
    ]
}

配置loadercss3

{
      test: /\.css$/,
      use: [
            {
              loader: "style-loader"
            }, {
              loader: "css-loader",
              options: {
                 modules: true
              }
            }, {
              loader: "postcss-loader"
            }
      ]
}

分離csses6

{
    test: /\.css$/,
    use: extractTextPlugin.extract({
        fallback: 'style-loader',
        use: [
            { loader: 'css-loader', options: { importLoaders: 1 } },
            'postcss-loader'
        ]
    })
}

清除未使用的CSS

npmn i -D purifycss-webpack purify-css
PurifyCSS-webpack要以來於purify-css這個包,因此這兩個都須要安裝web

由於咱們須要同步檢查html模板,因此咱們須要引入node的glob對象使用。在webpack.config.js文件頭部引入glob。npm

const glob =require('glob');
const PurifyCSSPlugin =require("purifycss-webpack");

new PurifyCSSPlugin({
        // Give paths to parse for rules. These should be absolute!
        paths: glob.sync(path.join(__dirname, 'src/*.html')),
        })

支持bable

npm i babel-core babel-loader babel-preset-env babel-preset-stage-0 babel-preset-react -D

{
    test:/\.jsx?$/,
    use: {
        loader: 'babel-loader',
        options: {
            presets: ["env","stage-0","react"]// env --> es6, stage-0 --> es7, react --> react
        }
    },
    include:path.join(__dirname,'./src'),
    exclude:/node_modules/
}

調試

配置devtool

  • source-map:在一個單獨文件中產生一個完整且功能徹底的文件。這個文件具備最好的source map,可是它會減慢打包速度;
  • cheap-module-source-map:在一個單獨的文件中產生一個不帶列映射的map,不帶列映射提升了打包速度,可是也使得瀏覽器開發者工具只能對應到具體的行,不能對應到具體的列(符號),會對調試形成不便。
  • eval-source-map:使用eval打包源文件模塊,在同一個文件中生產乾淨的完整版的sourcemap,可是對打包後輸出的JS文件的執行具備性能和安全的隱患。在開發階段這是一個很是好的選項,在生產階段則必定要不開啓這個選項。
  • cheap-module-eval-source-map:這是在打包文件時最快的生產source map的方法,生產的 Source map 會和打包後的JavaScript文件同行顯示,沒有影射列,和eval-source-map選項具備類似的缺點。
module.exports = {
  devtool: 'eval-source-map',
  entry:  __dirname + "/app/main.js",
  output: {
    path: __dirname + "/public",
    filename: "bundle.js"
  }
}

打包第三方庫

能夠直接在entry中引入
import $ from jquery
利用插件引入
const webpack = require('webpack')

new webpack.ProvidePlugin({
    $:"jquery"
})

打包靜態文件

npm install copy-webpack-plugin -D

const CopyWebpackPlugin = require('copy-webpack-plugin');
    plugins: [
        new CopyWebpackPlugin([{
            from: path.join(__dirname, 'public'),       // 從哪裏複製
            to: path.join(__dirname, 'dist', 'public')  // 複製到哪裏
    }])
]

打包以前,先清除已打包文件

npm install clean-webpack-plugin -D

const CleanWebpackPlugin = require('clean-webpack-plugin');
plugins: [
    new CleanWebpackPlugin([path.join(__dirname, 'dist')])
]

watch

watch: true,
    watchOptions: {
        ignored: /node_modules/, //忽略不用監聽變動的目錄
        aggregateTimeout: 500,  // 文件發生改變後多長時間後再從新編譯(Add a delay before rebuilding once the first file changed )
        poll:1000               //每秒詢問的文件變動的次數
    }

服務器代理

//請求到 /api/users 如今會被代理到請求 http://localhost:9000/api/users。
proxy: {
    "/api": "http://localhost:9000",
}

extensions

指定extension以後能夠不用在require或是import的時候加文件擴展名,會依次嘗試添加擴展名進行匹配

resolve: {
    //自動補全後綴,注意第一個必須是空字符串,後綴必定以點開頭
   extensions: ["",".js",".css",".json"],
},

alias別名

配置別名能夠加快webpack查找模塊的速度

  • 每當引入jquery模塊的時候,它會直接引入jqueryPath,而不須要從node_modules文件夾中按模塊的查找規則查找
  • 不須要webpack去解析jquery.js文件
const bootstrap = path.join(__dirname,'node_modules/bootstrap/dist/css/bootstrap.css');

resolve: {
    alias: {
        'bootstrap': bootstrap
    }
}

多頁面

// 多個入口,能夠給每一個入口添加html模板
entry: {
    index: './src/index.js',
    main:'./src/main.js'
},
output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].[hash].js',
    publicPath:PUBLIC_PATH
},

plugins: [
    new HtmlWebpackPlugin({
        minify: {
            removeAttributeQuotes:true
        },
        hash: true,
        template: './src/index.html',
        chunks:['index'],
        filename:'index.html'
    }),
    new HtmlWebpackPlugin({
        minify: {
            removeAttributeQuotes:true
        },
        hash: true,
        chunks:['login'],
        template: './src/login.html',
        filename:'login.html'
    })]
]
相關文章
相關標籤/搜索