browser-sync-webpack-plugin
Version:
BrowserSync and Webpack integration
61 lines (52 loc) • 1.85 kB
JavaScript
const browserSync = require('browser-sync')
const getCssOnlyEmittedAssetsNames = require('./getCssOnlyEmittedAssetsNames')
const defaultPluginOptions = {
reload: true,
name: 'bs-webpack-plugin',
callback: undefined,
injectCss: false
}
class BrowserSyncPlugin {
constructor (browserSyncOptions, pluginOptions) {
this.browserSyncOptions = Object.assign({}, browserSyncOptions)
this.options = Object.assign({}, defaultPluginOptions, pluginOptions)
this.browserSync = browserSync.create(this.options.name)
this.isWebpackWatching = false
this.isBrowserSyncRunning = false
}
apply (compiler) {
const watchRunCallback = () => {
this.isWebpackWatching = true
}
const compilationCallback = () => {
if (this.isBrowserSyncRunning && this.browserSyncOptions.notify) {
this.browserSync.notify('Rebuilding...')
}
}
const doneCallback = stats => {
if (!this.isWebpackWatching) {
return
}
if (!this.isBrowserSyncRunning) {
this.browserSync.init(this.browserSyncOptions, this.options.callback)
this.isBrowserSyncRunning = true
}
if (this.options.reload) {
this.browserSync.reload(this.options.injectCss && getCssOnlyEmittedAssetsNames(stats))
}
}
if (typeof compiler.hooks !== 'undefined') {
compiler.hooks.watchRun.tap(BrowserSyncPlugin.name, watchRunCallback)
compiler.hooks.compilation.tap(BrowserSyncPlugin.name, compilationCallback)
compiler.hooks.done.tap(BrowserSyncPlugin.name, doneCallback)
} else {
compiler.plugin('watch-run', (watching, callback) => {
watchRunCallback()
callback(null, null)
})
compiler.plugin('compilation', compilationCallback)
compiler.plugin('done', doneCallback)
}
}
}
module.exports = BrowserSyncPlugin