|
1 | | -const { extend, get, isFunction } = require('lodash') |
2 | | -const browserSync = require('browser-sync') |
3 | | - |
4 | | -function BrowserSyncPlugin(browserSyncOptions, pluginOptions) { |
5 | | - const defaultPluginOptions = { |
6 | | - reload: true, |
7 | | - name: 'bs-webpack-plugin', |
8 | | - callback: undefined, |
9 | | - injectCss: false |
10 | | - } |
11 | | - |
12 | | - this.browserSyncOptions = extend({}, browserSyncOptions) |
13 | | - this.options = extend({}, defaultPluginOptions, pluginOptions) |
14 | | - |
15 | | - this.browserSync = browserSync.create(this.options.name) |
16 | | - this.isWebpackWatching = false |
17 | | - this.isBrowserSyncRunning = false |
18 | | -} |
19 | | - |
20 | | -function isCssOnlyEmission(stats) { |
21 | | - const assetsStatsMapping = get(stats, 'compilation.assets', {}) |
22 | | - const assetsNames = Object.keys(assetsStatsMapping) |
23 | | - |
24 | | - return ( |
25 | | - assetsNames |
26 | | - .map(assetName => ({ name: assetName, wasEmitted: get(assetsStatsMapping, [assetName, 'emitted'], false) })) |
27 | | - .filter(asset => asset.wasEmitted) |
28 | | - .every(asset => asset.name.includes('.css')) |
29 | | - ) |
30 | | -} |
31 | | - |
32 | | -BrowserSyncPlugin.prototype.apply = function (compiler) { |
33 | | - compiler.plugin('watch-run', (watching, callback) => { |
34 | | - this.isWebpackWatching = true |
35 | | - callback(null, null) |
36 | | - }) |
37 | | - |
38 | | - compiler.plugin('compilation', () => { |
39 | | - if (this.isBrowserSyncRunning && this.browserSyncOptions.notify) { |
40 | | - this.browserSync.notify('Rebuilding...') |
41 | | - } |
42 | | - }) |
43 | | - |
44 | | - compiler.plugin('done', stats => { |
45 | | - if (this.isWebpackWatching) { |
46 | | - if (this.isBrowserSyncRunning) { |
47 | | - if (this.options.reload) { |
48 | | - if (this.options.injectCss && isCssOnlyEmission(stats)) { |
49 | | - this.browserSync.reload('*.css') |
50 | | - } else { |
51 | | - this.browserSync.reload() |
52 | | - } |
53 | | - } |
54 | | - } else { |
55 | | - if (isFunction(this.options.callback)) { |
56 | | - this.browserSync.init(this.browserSyncOptions, this.options.callback) |
57 | | - } else { |
58 | | - this.browserSync.init(this.browserSyncOptions) |
59 | | - } |
60 | | - |
61 | | - this.isBrowserSyncRunning = true |
62 | | - } |
63 | | - } |
64 | | - }) |
65 | | -} |
| 1 | +const BrowserSyncPlugin = require('./lib/BrowserSyncPlugin') |
66 | 2 |
|
67 | 3 | module.exports = BrowserSyncPlugin |
0 commit comments