@xunlie/vue-clickout 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of @xunlie/vue-clickout might be problematic. Click here for more details.
- package/.babelrc +8 -0
- package/CHANGELOG.md +11 -0
- package/README.md +116 -0
- package/build/build.js +35 -0
- package/build/check-versions.js +48 -0
- package/build/dev-client.js +9 -0
- package/build/dev-server.js +89 -0
- package/build/utils.js +71 -0
- package/build/vue-loader.conf.js +12 -0
- package/build/webpack.base.conf.js +58 -0
- package/build/webpack.dev.conf.js +34 -0
- package/build/webpack.lib.conf.js +40 -0
- package/build/webpack.prod.conf.js +120 -0
- package/config/dev.env.js +6 -0
- package/config/index.js +38 -0
- package/config/prod.env.js +3 -0
- package/demo/App.vue +26 -0
- package/demo/assets/community.css +1067 -0
- package/demo/assets/logo.png +0 -0
- package/demo/assets/reset.css +6 -0
- package/demo/components/commentItem.vue +63 -0
- package/demo/dist/index.html +1 -0
- package/demo/dist/static/css/app.0a3bdcaaa6f3b802a0a4342127401472.css +1 -0
- package/demo/dist/static/css/app.0a3bdcaaa6f3b802a0a4342127401472.css.map +1 -0
- package/demo/dist/static/js/app.a9b3c4b5a878ec2640e8.js +7 -0
- package/demo/dist/static/js/app.a9b3c4b5a878ec2640e8.js.map +1 -0
- package/demo/dist/static/js/manifest.f0144ada13d39efdc013.js +2 -0
- package/demo/dist/static/js/manifest.f0144ada13d39efdc013.js.map +1 -0
- package/demo/dist/static/js/vendor.5646344e475ac845fb16.js +7 -0
- package/demo/dist/static/js/vendor.5646344e475ac845fb16.js.map +1 -0
- package/demo/index.html +12 -0
- package/demo/main.js +21 -0
- package/demo/router/index.js +15 -0
- package/dist/vue-clickout.js +152 -0
- package/package.json +20 -0
- package/src/vue-clickout.js +62 -0
package/.babelrc
ADDED
package/CHANGELOG.md
ADDED
package/README.md
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# @xunlei/vue-clickout
|
|
2
|
+
|
|
3
|
+
> Vue clickout,轻松解决“点击空白处消失”这种问题
|
|
4
|
+
|
|
5
|
+
## 在线Demo
|
|
6
|
+
|
|
7
|
+
[https://xunleif2e.github.io/vue-clickout/demo/dist/index.html](https://xunleif2e.github.io/vue-clickout/demo/dist/index.html)
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
npm i @xunlei/vue-clickout -S
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## 注册指令
|
|
16
|
+
|
|
17
|
+
`clickout`事件是通过指令的方式实现的,因此使用前需注册指令,可以全局注册也可以局部注册。
|
|
18
|
+
|
|
19
|
+
### 全局注册
|
|
20
|
+
```javascript
|
|
21
|
+
import Vue from 'vue'
|
|
22
|
+
import VueClickout from '@xunlei/vue-clickout'
|
|
23
|
+
|
|
24
|
+
Vue.use(VueClickout)
|
|
25
|
+
```
|
|
26
|
+
### 局部注册
|
|
27
|
+
```html
|
|
28
|
+
<template>
|
|
29
|
+
<div class="face" v-clickout @clickout="open=false">
|
|
30
|
+
<a href="javascript:;" @click="open=!open">表情</a>
|
|
31
|
+
<div class="emoji">
|
|
32
|
+
<li title="开心"><span class="ico-emoji emoji-kaixin"></span></li>
|
|
33
|
+
<li title="可爱"><span class="ico-emoji emoji-keai"></span></li>
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
</template>
|
|
37
|
+
<script>
|
|
38
|
+
import { clickout } from '@xunlei/vue-clickout'
|
|
39
|
+
|
|
40
|
+
export default {
|
|
41
|
+
data () {
|
|
42
|
+
return {
|
|
43
|
+
open: false
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
// 注册指令
|
|
47
|
+
directives: {
|
|
48
|
+
clickout
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
</script>
|
|
52
|
+
```
|
|
53
|
+
### 用法
|
|
54
|
+
|
|
55
|
+
```html
|
|
56
|
+
<template>
|
|
57
|
+
<div class="item-comment">
|
|
58
|
+
<div class="comment-user">
|
|
59
|
+
<span class="user-name">疯狂的迷弟: </span>
|
|
60
|
+
<p class="text-comment">王祖贤越看越美</p>
|
|
61
|
+
<a href="javascript:;" class="reply-btn" @click="showReply=!showReply" ref="replyBtnRef">回复</a>
|
|
62
|
+
</div>
|
|
63
|
+
<div class="reply" v-clickout="['replyBtnRef']" @clickout="showReply=false">
|
|
64
|
+
<div class="reply-area" v-show="showReply">
|
|
65
|
+
<input type="text" class="ipt-reply">
|
|
66
|
+
<div class="reply-option">
|
|
67
|
+
<button>发送</button>
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
</div>
|
|
71
|
+
</div>
|
|
72
|
+
</template>
|
|
73
|
+
|
|
74
|
+
<script>
|
|
75
|
+
export default {
|
|
76
|
+
data () {
|
|
77
|
+
return {
|
|
78
|
+
showReply: false
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
</script>
|
|
83
|
+
```
|
|
84
|
+
### 参数
|
|
85
|
+
|
|
86
|
+
参数 | 说明 | 类型 |
|
|
87
|
+
| :-- | :-- | :-- |
|
|
88
|
+
| exceptRefs | 要排除的Ref,默认为指令所在的DOM | Array
|
|
89
|
+
|
|
90
|
+
## 开发命令
|
|
91
|
+
|
|
92
|
+
``` bash
|
|
93
|
+
# install deps
|
|
94
|
+
npm install
|
|
95
|
+
|
|
96
|
+
# serve demo at localhost:8080
|
|
97
|
+
npm run dev
|
|
98
|
+
|
|
99
|
+
# build library and demo
|
|
100
|
+
npm run build
|
|
101
|
+
|
|
102
|
+
# build library
|
|
103
|
+
npm run build:library
|
|
104
|
+
|
|
105
|
+
# build demo
|
|
106
|
+
npm run build:demo
|
|
107
|
+
|
|
108
|
+
# pre publish
|
|
109
|
+
npm run prepublish
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## License
|
|
113
|
+
|
|
114
|
+
[MIT](http://opensource.org/licenses/MIT)
|
|
115
|
+
|
|
116
|
+
Copyright (c) 2018 [greenfavo](https://github.com/greenfavo)
|
package/build/build.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require('./check-versions')()
|
|
2
|
+
|
|
3
|
+
process.env.NODE_ENV = 'production'
|
|
4
|
+
|
|
5
|
+
var ora = require('ora')
|
|
6
|
+
var rm = require('rimraf')
|
|
7
|
+
var path = require('path')
|
|
8
|
+
var chalk = require('chalk')
|
|
9
|
+
var webpack = require('webpack')
|
|
10
|
+
var config = require('../config')
|
|
11
|
+
var webpackConfig = require('./webpack.prod.conf')
|
|
12
|
+
|
|
13
|
+
var spinner = ora('building for production...')
|
|
14
|
+
spinner.start()
|
|
15
|
+
|
|
16
|
+
rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
|
|
17
|
+
if (err) throw err
|
|
18
|
+
webpack(webpackConfig, function (err, stats) {
|
|
19
|
+
spinner.stop()
|
|
20
|
+
if (err) throw err
|
|
21
|
+
process.stdout.write(stats.toString({
|
|
22
|
+
colors: true,
|
|
23
|
+
modules: false,
|
|
24
|
+
children: false,
|
|
25
|
+
chunks: false,
|
|
26
|
+
chunkModules: false
|
|
27
|
+
}) + '\n\n')
|
|
28
|
+
|
|
29
|
+
console.log(chalk.cyan(' Build complete.\n'))
|
|
30
|
+
console.log(chalk.yellow(
|
|
31
|
+
' Tip: built files are meant to be served over an HTTP server.\n' +
|
|
32
|
+
' Opening index.html over file:// won\'t work.\n'
|
|
33
|
+
))
|
|
34
|
+
})
|
|
35
|
+
})
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
var chalk = require('chalk')
|
|
2
|
+
var semver = require('semver')
|
|
3
|
+
var packageConfig = require('../package.json')
|
|
4
|
+
var shell = require('shelljs')
|
|
5
|
+
function exec (cmd) {
|
|
6
|
+
return require('child_process').execSync(cmd).toString().trim()
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
var versionRequirements = [
|
|
10
|
+
{
|
|
11
|
+
name: 'node',
|
|
12
|
+
currentVersion: semver.clean(process.version),
|
|
13
|
+
versionRequirement: packageConfig.engines.node
|
|
14
|
+
},
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
if (shell.which('npm')) {
|
|
18
|
+
versionRequirements.push({
|
|
19
|
+
name: 'npm',
|
|
20
|
+
currentVersion: exec('npm --version'),
|
|
21
|
+
versionRequirement: packageConfig.engines.npm
|
|
22
|
+
})
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
module.exports = function () {
|
|
26
|
+
var warnings = []
|
|
27
|
+
for (var i = 0; i < versionRequirements.length; i++) {
|
|
28
|
+
var mod = versionRequirements[i]
|
|
29
|
+
if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
|
|
30
|
+
warnings.push(mod.name + ': ' +
|
|
31
|
+
chalk.red(mod.currentVersion) + ' should be ' +
|
|
32
|
+
chalk.green(mod.versionRequirement)
|
|
33
|
+
)
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (warnings.length) {
|
|
38
|
+
console.log('')
|
|
39
|
+
console.log(chalk.yellow('To use this template, you must update following to modules:'))
|
|
40
|
+
console.log()
|
|
41
|
+
for (var i = 0; i < warnings.length; i++) {
|
|
42
|
+
var warning = warnings[i]
|
|
43
|
+
console.log(' ' + warning)
|
|
44
|
+
}
|
|
45
|
+
console.log()
|
|
46
|
+
process.exit(1)
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
require('./check-versions')()
|
|
2
|
+
|
|
3
|
+
var config = require('../config')
|
|
4
|
+
if (!process.env.NODE_ENV) {
|
|
5
|
+
process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV)
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
var opn = require('opn')
|
|
9
|
+
var path = require('path')
|
|
10
|
+
var express = require('express')
|
|
11
|
+
var webpack = require('webpack')
|
|
12
|
+
var proxyMiddleware = require('http-proxy-middleware')
|
|
13
|
+
var webpackConfig = require('./webpack.dev.conf')
|
|
14
|
+
|
|
15
|
+
// default port where dev server listens for incoming traffic
|
|
16
|
+
var port = process.env.PORT || config.dev.port
|
|
17
|
+
// automatically open browser, if not set will be false
|
|
18
|
+
var autoOpenBrowser = !!config.dev.autoOpenBrowser
|
|
19
|
+
// Define HTTP proxies to your custom API backend
|
|
20
|
+
// https://github.com/chimurai/http-proxy-middleware
|
|
21
|
+
var proxyTable = config.dev.proxyTable
|
|
22
|
+
|
|
23
|
+
var app = express()
|
|
24
|
+
var compiler = webpack(webpackConfig)
|
|
25
|
+
|
|
26
|
+
var devMiddleware = require('webpack-dev-middleware')(compiler, {
|
|
27
|
+
publicPath: webpackConfig.output.publicPath,
|
|
28
|
+
quiet: true
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
var hotMiddleware = require('webpack-hot-middleware')(compiler, {
|
|
32
|
+
log: () => {}
|
|
33
|
+
})
|
|
34
|
+
// force page reload when html-webpack-plugin template changes
|
|
35
|
+
compiler.plugin('compilation', function (compilation) {
|
|
36
|
+
compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) {
|
|
37
|
+
hotMiddleware.publish({ action: 'reload' })
|
|
38
|
+
cb()
|
|
39
|
+
})
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
// proxy api requests
|
|
43
|
+
Object.keys(proxyTable).forEach(function (context) {
|
|
44
|
+
var options = proxyTable[context]
|
|
45
|
+
if (typeof options === 'string') {
|
|
46
|
+
options = { target: options }
|
|
47
|
+
}
|
|
48
|
+
app.use(proxyMiddleware(options.filter || context, options))
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
// handle fallback for HTML5 history API
|
|
52
|
+
app.use(require('connect-history-api-fallback')())
|
|
53
|
+
|
|
54
|
+
// serve webpack bundle output
|
|
55
|
+
app.use(devMiddleware)
|
|
56
|
+
|
|
57
|
+
// enable hot-reload and state-preserving
|
|
58
|
+
// compilation error display
|
|
59
|
+
app.use(hotMiddleware)
|
|
60
|
+
|
|
61
|
+
// serve pure static assets
|
|
62
|
+
var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory)
|
|
63
|
+
app.use(staticPath, express.static('./demo/static'))
|
|
64
|
+
|
|
65
|
+
var uri = 'http://localhost:' + port
|
|
66
|
+
|
|
67
|
+
var _resolve
|
|
68
|
+
var readyPromise = new Promise(resolve => {
|
|
69
|
+
_resolve = resolve
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
console.log('> Starting dev server...')
|
|
73
|
+
devMiddleware.waitUntilValid(() => {
|
|
74
|
+
console.log('> Listening at ' + uri + '\n')
|
|
75
|
+
// when env is testing, don't need open it
|
|
76
|
+
if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') {
|
|
77
|
+
opn(uri)
|
|
78
|
+
}
|
|
79
|
+
_resolve()
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
var server = app.listen(port)
|
|
83
|
+
|
|
84
|
+
module.exports = {
|
|
85
|
+
ready: readyPromise,
|
|
86
|
+
close: () => {
|
|
87
|
+
server.close()
|
|
88
|
+
}
|
|
89
|
+
}
|
package/build/utils.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
var path = require('path')
|
|
2
|
+
var config = require('../config')
|
|
3
|
+
var ExtractTextPlugin = require('extract-text-webpack-plugin')
|
|
4
|
+
|
|
5
|
+
exports.assetsPath = function (_path) {
|
|
6
|
+
var assetsSubDirectory = process.env.NODE_ENV === 'production'
|
|
7
|
+
? config.build.assetsSubDirectory
|
|
8
|
+
: config.dev.assetsSubDirectory
|
|
9
|
+
return path.posix.join(assetsSubDirectory, _path)
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
exports.cssLoaders = function (options) {
|
|
13
|
+
options = options || {}
|
|
14
|
+
|
|
15
|
+
var cssLoader = {
|
|
16
|
+
loader: 'css-loader',
|
|
17
|
+
options: {
|
|
18
|
+
minimize: process.env.NODE_ENV === 'production',
|
|
19
|
+
sourceMap: options.sourceMap
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// generate loader string to be used with extract text plugin
|
|
24
|
+
function generateLoaders (loader, loaderOptions) {
|
|
25
|
+
var loaders = [cssLoader]
|
|
26
|
+
if (loader) {
|
|
27
|
+
loaders.push({
|
|
28
|
+
loader: loader + '-loader',
|
|
29
|
+
options: Object.assign({}, loaderOptions, {
|
|
30
|
+
sourceMap: options.sourceMap
|
|
31
|
+
})
|
|
32
|
+
})
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Extract CSS when that option is specified
|
|
36
|
+
// (which is the case during production build)
|
|
37
|
+
if (options.extract) {
|
|
38
|
+
return ExtractTextPlugin.extract({
|
|
39
|
+
use: loaders,
|
|
40
|
+
fallback: 'vue-style-loader'
|
|
41
|
+
})
|
|
42
|
+
} else {
|
|
43
|
+
return ['vue-style-loader'].concat(loaders)
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// https://vue-loader.vuejs.org/en/configurations/extract-css.html
|
|
48
|
+
return {
|
|
49
|
+
css: generateLoaders(),
|
|
50
|
+
postcss: generateLoaders(),
|
|
51
|
+
less: generateLoaders('less'),
|
|
52
|
+
sass: generateLoaders('sass', { indentedSyntax: true }),
|
|
53
|
+
scss: generateLoaders('sass'),
|
|
54
|
+
stylus: generateLoaders('stylus'),
|
|
55
|
+
styl: generateLoaders('stylus')
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Generate loaders for standalone style files (outside of .vue)
|
|
60
|
+
exports.styleLoaders = function (options) {
|
|
61
|
+
var output = []
|
|
62
|
+
var loaders = exports.cssLoaders(options)
|
|
63
|
+
for (var extension in loaders) {
|
|
64
|
+
var loader = loaders[extension]
|
|
65
|
+
output.push({
|
|
66
|
+
test: new RegExp('\\.' + extension + '$'),
|
|
67
|
+
use: loader
|
|
68
|
+
})
|
|
69
|
+
}
|
|
70
|
+
return output
|
|
71
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
var utils = require('./utils')
|
|
2
|
+
var config = require('../config')
|
|
3
|
+
var isProduction = process.env.NODE_ENV === 'production'
|
|
4
|
+
|
|
5
|
+
module.exports = {
|
|
6
|
+
loaders: utils.cssLoaders({
|
|
7
|
+
sourceMap: isProduction
|
|
8
|
+
? config.build.productionSourceMap
|
|
9
|
+
: config.dev.cssSourceMap,
|
|
10
|
+
extract: isProduction
|
|
11
|
+
})
|
|
12
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
var path = require('path')
|
|
2
|
+
var utils = require('./utils')
|
|
3
|
+
var config = require('../config')
|
|
4
|
+
var vueLoaderConfig = require('./vue-loader.conf')
|
|
5
|
+
|
|
6
|
+
function resolve (dir) {
|
|
7
|
+
return path.join(__dirname, '..', dir)
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
module.exports = {
|
|
11
|
+
entry: {
|
|
12
|
+
app: './demo/main.js'
|
|
13
|
+
},
|
|
14
|
+
output: {
|
|
15
|
+
path: config.build.assetsRoot,
|
|
16
|
+
filename: '[name].js',
|
|
17
|
+
publicPath: process.env.NODE_ENV === 'production'
|
|
18
|
+
? config.build.assetsPublicPath
|
|
19
|
+
: config.dev.assetsPublicPath
|
|
20
|
+
},
|
|
21
|
+
resolve: {
|
|
22
|
+
extensions: ['.js', '.vue', '.json'],
|
|
23
|
+
alias: {
|
|
24
|
+
'vue$': 'vue/dist/vue.esm.js',
|
|
25
|
+
'@': resolve('demo')
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
module: {
|
|
29
|
+
rules: [
|
|
30
|
+
{
|
|
31
|
+
test: /\.vue$/,
|
|
32
|
+
loader: 'vue-loader',
|
|
33
|
+
options: vueLoaderConfig
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
test: /\.js$/,
|
|
37
|
+
loader: 'babel-loader',
|
|
38
|
+
include: [resolve('demo'), resolve('test')]
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
|
|
42
|
+
loader: 'url-loader',
|
|
43
|
+
options: {
|
|
44
|
+
limit: 10000,
|
|
45
|
+
name: utils.assetsPath('img/[name].[hash:7].[ext]')
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
|
|
50
|
+
loader: 'url-loader',
|
|
51
|
+
options: {
|
|
52
|
+
limit: 10000,
|
|
53
|
+
name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
]
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
var utils = require('./utils')
|
|
2
|
+
var webpack = require('webpack')
|
|
3
|
+
var config = require('../config')
|
|
4
|
+
var merge = require('webpack-merge')
|
|
5
|
+
var baseWebpackConfig = require('./webpack.base.conf')
|
|
6
|
+
var HtmlWebpackPlugin = require('html-webpack-plugin')
|
|
7
|
+
var FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
|
|
8
|
+
|
|
9
|
+
// add hot-reload related code to entry chunks
|
|
10
|
+
Object.keys(baseWebpackConfig.entry).forEach(function (name) {
|
|
11
|
+
baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name])
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
module.exports = merge(baseWebpackConfig, {
|
|
15
|
+
module: {
|
|
16
|
+
rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap })
|
|
17
|
+
},
|
|
18
|
+
// cheap-module-eval-source-map is faster for development
|
|
19
|
+
devtool: '#cheap-module-eval-source-map',
|
|
20
|
+
plugins: [
|
|
21
|
+
new webpack.DefinePlugin({
|
|
22
|
+
'process.env': config.dev.env
|
|
23
|
+
}),
|
|
24
|
+
// https://github.com/glenjamin/webpack-hot-middleware#installation--usage
|
|
25
|
+
new webpack.HotModuleReplacementPlugin(),
|
|
26
|
+
new webpack.NoEmitOnErrorsPlugin(),
|
|
27
|
+
// https://github.com/ampedandwired/html-webpack-plugin
|
|
28
|
+
new HtmlWebpackPlugin({
|
|
29
|
+
template: 'demo/index.html',
|
|
30
|
+
inject: true
|
|
31
|
+
}),
|
|
32
|
+
new FriendlyErrorsPlugin()
|
|
33
|
+
]
|
|
34
|
+
})
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
var path = require('path')
|
|
2
|
+
var utils = require('./utils')
|
|
3
|
+
var config = require('../config')
|
|
4
|
+
var vueLoaderConfig = require('./vue-loader.conf')
|
|
5
|
+
|
|
6
|
+
function resolve (dir) {
|
|
7
|
+
return path.join(__dirname, '..', dir)
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
module.exports = {
|
|
11
|
+
entry: {
|
|
12
|
+
'vue-clickout': './src/vue-clickout'
|
|
13
|
+
},
|
|
14
|
+
output: {
|
|
15
|
+
path: resolve('dist'),
|
|
16
|
+
filename: '[name].js',
|
|
17
|
+
library: 'vueClickOut',
|
|
18
|
+
libraryTarget: 'umd'
|
|
19
|
+
},
|
|
20
|
+
resolve: {
|
|
21
|
+
extensions: ['.js', '.vue', '.json']
|
|
22
|
+
},
|
|
23
|
+
module: {
|
|
24
|
+
rules: [
|
|
25
|
+
{
|
|
26
|
+
test: /\.vue$/,
|
|
27
|
+
loader: 'vue-loader',
|
|
28
|
+
options: vueLoaderConfig
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
test: /\.js$/,
|
|
32
|
+
loader: 'babel-loader',
|
|
33
|
+
include: [resolve('src')]
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
},
|
|
37
|
+
node: {
|
|
38
|
+
process: false
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
var path = require('path')
|
|
2
|
+
var utils = require('./utils')
|
|
3
|
+
var webpack = require('webpack')
|
|
4
|
+
var config = require('../config')
|
|
5
|
+
var merge = require('webpack-merge')
|
|
6
|
+
var baseWebpackConfig = require('./webpack.base.conf')
|
|
7
|
+
var CopyWebpackPlugin = require('copy-webpack-plugin')
|
|
8
|
+
var HtmlWebpackPlugin = require('html-webpack-plugin')
|
|
9
|
+
var ExtractTextPlugin = require('extract-text-webpack-plugin')
|
|
10
|
+
var OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
|
|
11
|
+
|
|
12
|
+
var env = config.build.env
|
|
13
|
+
|
|
14
|
+
var webpackConfig = merge(baseWebpackConfig, {
|
|
15
|
+
module: {
|
|
16
|
+
rules: utils.styleLoaders({
|
|
17
|
+
sourceMap: config.build.productionSourceMap,
|
|
18
|
+
extract: true
|
|
19
|
+
})
|
|
20
|
+
},
|
|
21
|
+
devtool: config.build.productionSourceMap ? '#source-map' : false,
|
|
22
|
+
output: {
|
|
23
|
+
path: config.build.assetsRoot,
|
|
24
|
+
filename: utils.assetsPath('js/[name].[chunkhash].js'),
|
|
25
|
+
chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
|
|
26
|
+
},
|
|
27
|
+
plugins: [
|
|
28
|
+
// http://vuejs.github.io/vue-loader/en/workflow/production.html
|
|
29
|
+
new webpack.DefinePlugin({
|
|
30
|
+
'process.env': env
|
|
31
|
+
}),
|
|
32
|
+
new webpack.optimize.UglifyJsPlugin({
|
|
33
|
+
compress: {
|
|
34
|
+
warnings: false
|
|
35
|
+
},
|
|
36
|
+
sourceMap: true
|
|
37
|
+
}),
|
|
38
|
+
// extract css into its own file
|
|
39
|
+
new ExtractTextPlugin({
|
|
40
|
+
filename: utils.assetsPath('css/[name].[contenthash].css')
|
|
41
|
+
}),
|
|
42
|
+
// Compress extracted CSS. We are using this plugin so that possible
|
|
43
|
+
// duplicated CSS from different components can be deduped.
|
|
44
|
+
new OptimizeCSSPlugin({
|
|
45
|
+
cssProcessorOptions: {
|
|
46
|
+
safe: true
|
|
47
|
+
}
|
|
48
|
+
}),
|
|
49
|
+
// generate dist index.html with correct asset hash for caching.
|
|
50
|
+
// you can customize output by editing /index.html
|
|
51
|
+
// see https://github.com/ampedandwired/html-webpack-plugin
|
|
52
|
+
new HtmlWebpackPlugin({
|
|
53
|
+
filename: config.build.index,
|
|
54
|
+
template: 'demo/index.html',
|
|
55
|
+
inject: true,
|
|
56
|
+
minify: {
|
|
57
|
+
removeComments: true,
|
|
58
|
+
collapseWhitespace: true,
|
|
59
|
+
removeAttributeQuotes: true
|
|
60
|
+
// more options:
|
|
61
|
+
// https://github.com/kangax/html-minifier#options-quick-reference
|
|
62
|
+
},
|
|
63
|
+
// necessary to consistently work with multiple chunks via CommonsChunkPlugin
|
|
64
|
+
chunksSortMode: 'dependency'
|
|
65
|
+
}),
|
|
66
|
+
// split vendor js into its own file
|
|
67
|
+
new webpack.optimize.CommonsChunkPlugin({
|
|
68
|
+
name: 'vendor',
|
|
69
|
+
minChunks: function (module, count) {
|
|
70
|
+
// any required modules inside node_modules are extracted to vendor
|
|
71
|
+
return (
|
|
72
|
+
module.resource &&
|
|
73
|
+
/\.js$/.test(module.resource) &&
|
|
74
|
+
module.resource.indexOf(
|
|
75
|
+
path.join(__dirname, '../node_modules')
|
|
76
|
+
) === 0
|
|
77
|
+
)
|
|
78
|
+
}
|
|
79
|
+
}),
|
|
80
|
+
// extract webpack runtime and module manifest to its own file in order to
|
|
81
|
+
// prevent vendor hash from being updated whenever app bundle is updated
|
|
82
|
+
new webpack.optimize.CommonsChunkPlugin({
|
|
83
|
+
name: 'manifest',
|
|
84
|
+
chunks: ['vendor']
|
|
85
|
+
}),
|
|
86
|
+
// copy custom static assets
|
|
87
|
+
new CopyWebpackPlugin([
|
|
88
|
+
{
|
|
89
|
+
from: path.resolve(__dirname, '../demo/static'),
|
|
90
|
+
to: config.build.assetsSubDirectory,
|
|
91
|
+
ignore: ['.*']
|
|
92
|
+
}
|
|
93
|
+
])
|
|
94
|
+
]
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
if (config.build.productionGzip) {
|
|
98
|
+
var CompressionWebpackPlugin = require('compression-webpack-plugin')
|
|
99
|
+
|
|
100
|
+
webpackConfig.plugins.push(
|
|
101
|
+
new CompressionWebpackPlugin({
|
|
102
|
+
asset: '[path].gz[query]',
|
|
103
|
+
algorithm: 'gzip',
|
|
104
|
+
test: new RegExp(
|
|
105
|
+
'\\.(' +
|
|
106
|
+
config.build.productionGzipExtensions.join('|') +
|
|
107
|
+
')$'
|
|
108
|
+
),
|
|
109
|
+
threshold: 10240,
|
|
110
|
+
minRatio: 0.8
|
|
111
|
+
})
|
|
112
|
+
)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (config.build.bundleAnalyzerReport) {
|
|
116
|
+
var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
|
|
117
|
+
webpackConfig.plugins.push(new BundleAnalyzerPlugin())
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
module.exports = webpackConfig
|