├── .babelrc ├── .editorconfig ├── .gitignore ├── LICENSE ├── README.md ├── dist └── panda-vue.js ├── mixins ├── canJumpMixin.js ├── chartInitMixin.js ├── dispatchBroadcastMixin.js └── sysParamsMixin.js ├── package.json ├── packages └── basictable │ ├── index.js │ └── src │ └── main.vue ├── src └── index.js └── webpack.config.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["env", { "modules": false }], 4 | "stage-3" 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | dist/ 4 | npm-debug.log 5 | yarn-error.log 6 | 7 | # Editor directories and files 8 | .idea 9 | *.suo 10 | *.ntvs* 11 | *.njsproj 12 | *.sln 13 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Panda Front End Team 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # panda-vue 2 | [![npm](https://img.shields.io/npm/v/panda-vue.svg)](https://www.npmjs.com/package/panda-vue) 3 | ![license](https://img.shields.io/github/license/jserwang/rc-bmap.svg) 4 | 5 | > by Panda-FET 6 | 7 | 8 | 9 | ## Contents 10 | 11 | ### mixins 12 | 13 | 1. **canJumpMixin**:在组件要跳转的时候多此一举的拦住用户并且问他,你真的要跳转吗 14 | 2. **sysParamsMixin**:获取系统数据字典 15 | 3. **dispatchBroadcastMixin**:实现broadcast\dispatch,子组件dispatch提交事件,父组件broadcast广播事件 16 | 4. **chartInitMixin**:完成 Echart 图表的初始化、注销、自动注册 resize 事件、注销 resize 事件 17 | 18 | 19 | 20 | ### components 21 | 22 | 1. **BasicTable**:基础表格组件 23 | 24 | ## ToDos 25 | 26 | - [ ] 按需加载与全局加载可选切换 27 | - [ ] 文档 Docs 28 | - [ ] mixins、components的使用Demo 29 | 30 | ## 协议 31 | 32 | [MIT 许可证](https://opensource.org/licenses/MIT) 33 | -------------------------------------------------------------------------------- /dist/panda-vue.js: -------------------------------------------------------------------------------- 1 | !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("panda-vue",[],t):"object"==typeof exports?exports["panda-vue"]=t():e["panda-vue"]=t()}("undefined"!=typeof self?self:this,function(){return function(e){function t(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,t),r.l=!0,r.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,o){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:o})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="/dist/",t(t.s=1)}([function(e,t,n){"use strict";var o={descending:"desc",ascending:"ASC"};t.a={name:"BasicTable",props:{api:{type:Function},columns:{type:Array},initCondition:{type:Object},initSearch:{type:Boolean,default:!0},hasIndex:{type:Boolean,default:!1},hasSelect:{type:Boolean,default:!1}},data:function(){return{page:1,rows:10,total:0,storeParams:{},listLoading:!1,dataList:[],sortParams:{orderColumn:"",orderBy:""},multipleSelection:[],popoverShow:!1}},methods:{getlist:function(e){var t=this;this.api(e).then(function(e){t.listLoading=!1;var n=e.data,o=n.total,r=n.dataList;t.dataList=r,t.total=o,t.listLoading=!1}).catch(function(e){console.error(e),t.listLoading=!1})},reSearch:function(){this.listLoading=!0,this.page=1;var e=Object.assign({},this.storeParams,this.sortParams);e.rows=this.rows,e.page=this.page,this.getlist(e)},search:function(e){this.storeParams=Object.assign({},e),this.reSearch()},handleSizeChange:function(e){var t=this;this.listLoading=!0,this.rows=e;var n=Object.assign({},this.storeParams,this.sortParams);n.rows=e,n.page=this.page,setTimeout(function(){return t.getlist(n)},100)},handleCurrentChange:function(e){var t=this;this.listLoading=!0,this.page=e;var n=Object.assign({},this.storeParams,this.sortParams);n.rows=this.rows,n.page=e,setTimeout(function(){return t.getlist(n)},100)},sortChange:function(e){var t=(e.column,e.prop),n=e.order;this.sortParams.orderColumn=t||"",this.sortParams.orderBy=n?o[n]:"",this.reSearch()},handleSelectionChange:function(e){this.multipleSelection=e},handleClose:function(e,t){var n="popover-"+e+"-"+t;this.$refs[n][1].doClose()},handleConfirm:function(e,t,n,o){o(t,n),this.handleClose(e,t)}},mounted:function(){this.initSearch&&this.search(this.initCondition)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=n(2),r=n(11),a=n.n(r),i=[o.a],s=function(e){arguments.length>1&&void 0!==arguments[1]&&arguments[1];i.map(function(t){e.component(t.name,t)})};"undefined"!=typeof window&&window.Vue&&s(window.Vue),t.default={version:a.a.version,install:s,BasicTable:o.a}},function(e,t,n){"use strict";var o=n(3);o.a.install=function(e){e.component(o.a.name,o.a)},t.a=o.a},function(e,t,n){"use strict";function o(e){n(4)}var r=n(0),a=n(10),i=n(9),s=o,l=i(r.a,a.a,!1,s,"data-v-d896d3ba",null);t.a=l.exports},function(e,t,n){var o=n(5);"string"==typeof o&&(o=[[e.i,o,""]]),o.locals&&(e.exports=o.locals);n(7)("c331de74",o,!0,{})},function(e,t,n){t=e.exports=n(6)(!1),t.push([e.i,".basic-table .clickable-link[data-v-d896d3ba]{font-size:14px;color:#07f;cursor:pointer}.basic-table .el-tag[data-v-d896d3ba]{margin:3px 10px}.basic-table[data-v-d896d3ba] .form-icon{padding-top:0;padding-bottom:0;border-radius:0}",""])},function(e,t){function n(e,t){var n=e[1]||"",r=e[3];if(!r)return n;if(t&&"function"==typeof btoa){var a=o(r);return[n].concat(r.sources.map(function(e){return"/*# sourceURL="+r.sourceRoot+e+" */"})).concat([a]).join("\n")}return[n].join("\n")}function o(e){return"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(e))))+" */"}e.exports=function(e){var t=[];return t.toString=function(){return this.map(function(t){var o=n(t,e);return t[2]?"@media "+t[2]+"{"+o+"}":o}).join("")},t.i=function(e,n){"string"==typeof e&&(e=[[null,e,""]]);for(var o={},r=0;rn.parts.length&&(o.parts.length=n.parts.length)}else{for(var i=[],r=0;r",main:"dist/panda-vue.js",license:"MIT",private:!1,scripts:{dev:"cross-env NODE_ENV=development webpack-dev-server --open --hot",build:"cross-env NODE_ENV=production webpack --progress --hide-modules"},repository:{type:"git",url:"git+https://github.com/panda-fe/panda-vue"},dependencies:{vue:"^2.5.11"},browserslist:["> 1%","last 2 versions","not ie <= 8"],keywords:["vue","panda"],bugs:{url:"https://github.com/panda-fe/panda-vue/issues"},peerDependencies:{"element-ui":"^2.2.1",vue:"^2.5.11"},devDependencies:{"babel-core":"^6.26.0","babel-loader":"^7.1.2","babel-preset-env":"^1.6.0","babel-preset-stage-3":"^6.24.1","cross-env":"^5.0.5","css-loader":"^0.28.7","file-loader":"^1.1.4","node-sass":"^4.9.2","sass-loader":"^7.0.3","vue-loader":"^13.0.5","vue-template-compiler":"^2.4.4",webpack:"^3.6.0","webpack-dev-server":"^2.9.1"}}}])}); 2 | //# sourceMappingURL=panda-vue.js.map -------------------------------------------------------------------------------- /mixins/canJumpMixin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 创建于 2018/10/10 3 | * 功能: 在组件要跳转的时候多此一举的拦住用户并且问他,你真的要跳转吗 _(:з」∠)_ 4 | */ 5 | 6 | const canJumpMixin = { 7 | data() { 8 | return { 9 | $_canJump: true, // 是否可以直接跳转 10 | $_tipsMessage: '是否放弃当前操作?' // 提示 11 | } 12 | }, 13 | methods: { 14 | /** 15 | * 信息修改标记 16 | */ 17 | _infoChange(flag) { 18 | this.$data.$_canJump = flag 19 | }, 20 | 21 | /** 22 | * 改变提示 23 | * @param res 24 | * @private 25 | */ 26 | _tipsMessageChange(res) { 27 | this.$data.$_tipsMessage = res || '是否放弃当前操作?' 28 | } 29 | }, 30 | beforeRouteLeave(to, from, next) { 31 | if (!this.$data.$_canJump) { // 跳转前提示是否保存 32 | this.$confirm && this.$confirm(this.$data.$_tipsMessage, '提示', { 33 | center: true, 34 | confirmButtonText: '确定', 35 | cancelButtonText: '取消', 36 | type: 'warning' 37 | }) 38 | .then(() => next()) 39 | .catch(() => next(false)) 40 | } else next() 41 | } 42 | } 43 | 44 | export default canJumpMixin 45 | -------------------------------------------------------------------------------- /mixins/chartInitMixin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 创建于 2019-03-28 3 | * 维护: SHERlocked93 4 | * 功能: 完成 Echart 图表的初始化、注销、自动注册 resize 事件、注销 resize 事件 5 | * 注意: 实际环境中,初始化的时候记得调用一下 _chartResize 方法 6 | * 接口: * _chartDomId:String|Array 初始化的chart容器,ID选择器 7 | * * _chartOption: Object|Array chart对应的配置项,key为ID 8 | */ 9 | 10 | import Echarts from 'echarts' 11 | import _ from 'lodash' 12 | 13 | export default { 14 | data() { 15 | return { 16 | _chartIsList: null // chartDomId传的是string还是array 17 | } 18 | }, 19 | 20 | computed: { 21 | /** 22 | * 图表DOM 23 | * @returns {*} 24 | */ 25 | _chartWrapperDom() { 26 | const _chartDomId = this.$data._chartDomId 27 | 28 | if (_.isString(_chartDomId)) { 29 | const dom = document.getElementById(_chartDomId) 30 | return dom && Echarts.init(dom) 31 | } else if (_.isArray(_chartDomId)) { 32 | const domList = _chartDomId.map(id => document.getElementById(id)) 33 | return domList && domList.map(dom => Echarts.init(dom)) 34 | } else throw new Error('_chartDomId 应为 Array 或 String') 35 | }, 36 | 37 | /** 38 | * 图表resize节流 39 | * @return {*} 40 | */ 41 | _chartResize() { 42 | return _.throttle(() => { 43 | if (this.$data._chartIsList) { 44 | this._chartWrapperDom.forEach(chart => chart.resize()) 45 | } else this._chartWrapperDom.resize() 46 | }, 400) 47 | } 48 | }, 49 | 50 | methods: { 51 | /** 52 | * 图表初始化 53 | */ 54 | _initChart() { 55 | const _chartDomId = this.$data._chartDomId 56 | const _chartOption = this.$data._chartOption 57 | const _chartIsList = this.$data._chartIsList 58 | 59 | if (_chartIsList) { 60 | _chartDomId.forEach((key, idx) => 61 | this._chartWrapperDom[idx].setOption(_chartOption[key])) 62 | } else this._chartWrapperDom.setOption(_chartOption) 63 | } 64 | }, 65 | 66 | mounted() { 67 | const _chartDomId = this.$data._chartDomId 68 | this.$data._chartIsList = _.isArray(_chartDomId) 69 | this._initChart() 70 | window.addEventListener('resize', this._chartResize) 71 | }, 72 | 73 | destroyed() { 74 | window.removeEventListener('resize', this._chartResize) 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /mixins/dispatchBroadcastMixin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 创建于 2018/10/30 3 | * 作者: QianYu 4 | * 功能: 实现 broadcast / dispatch,子组件可以dispatch提交事件,父组件可以broadcast广播事件 5 | */ 6 | 7 | function broadcast(componentName, eventName, ...params) { 8 | this.$children.forEach(child => { 9 | const name = child.$options.name 10 | 11 | if (name === componentName) { 12 | child.$emit(eventName, ...params) 13 | } else { 14 | broadcast.call(child, componentName, eventName, ...params) 15 | } 16 | }) 17 | } 18 | 19 | export default { 20 | methods: { 21 | /** 22 | * 提交事件,子组件往祖先元素提交事件 23 | * @param componentName 组件名 24 | * @param eventName 事件名 25 | * @param params 参数 26 | */ 27 | $dispatch(componentName, eventName, ...params) { 28 | let parent = this.$parent || this.$root 29 | let name = parent.$options.name 30 | 31 | while (parent && (!name || name !== componentName)) { 32 | parent = parent.$parent 33 | parent && (name = parent.$options.name) 34 | } 35 | parent && parent.$emit(eventName, ...params) 36 | }, 37 | 38 | /** 39 | * 广播事件,如果子组件没有则找子组件的子组件 40 | * @param componentName 组件名 41 | * @param eventName 事件名 42 | * @param params 参数 43 | */ 44 | $broadcast(componentName, eventName, ...params) { 45 | broadcast.call(this, componentName, eventName, ...params) 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /mixins/sysParamsMixin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 创建于 2018/9/7 3 | * 作者: QianYu 4 | * type: 全局mixins 5 | * 功能: 获取系统数据字典 6 | */ 7 | 8 | export default { 9 | data() { 10 | return { 11 | $_filterFunc: null, // 过滤器函数 12 | $_sysParams: null, // 获取数据字典 13 | $_sysParamsPromise: null, // 获取sysParams之后返回的Promise 14 | $_sysParamsApi: () => {} // 需被覆写,取数据字典的Api 15 | } 16 | }, 17 | methods: { 18 | /** 19 | * 注册过滤器到_filterFunc中 20 | * @private 21 | */ 22 | _getSysParamsFunc() { 23 | const { $data } = this 24 | return $data.$_sysParamsPromise || ($data._sysParamsPromise = $data.$_sysParamsApi() 25 | .then(({ data }) => { 26 | this.$data.$_sysParams = data 27 | this.$data.$_filterFunc = {} 28 | Object.keys(data).forEach(paramKey => 29 | this.$data.$_filterFunc[paramKey] = val => { 30 | const tar = data[paramKey].find(item => item['paramValue'] === val) 31 | return tar && tar['paramDesc'] || '' 32 | }) 33 | return data 34 | }) 35 | .catch(err => console.error(err, ' in src/mixins/sysParamsMixin.js'))) 36 | }, 37 | 38 | /** 39 | * 按照键值获取单个过滤器 40 | * @returns {*} 41 | * @param id 过滤器key 42 | * @param val 传给过滤器的value 43 | */ 44 | _rootFilters(val, id = 'DEPARTMENT') { 45 | const func = this.$data.$_filterFunc 46 | const mth = func && func[id] 47 | return mth && mth(val) || val 48 | }, 49 | 50 | /** 51 | * 获取数据字典 52 | * @returns {Object} 53 | * @private 54 | */ 55 | _getSysParams() { 56 | return this.$data.$_sysParams 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "panda-vue", 3 | "description": "Repository of Panda Front End Team", 4 | "version": "0.2.0", 5 | "author": "panda-fe", 6 | "main": "dist/panda-vue.js", 7 | "license": "MIT", 8 | "private": false, 9 | "scripts": { 10 | "dev": "cross-env NODE_ENV=development webpack-dev-server --open --hot", 11 | "build": "cross-env NODE_ENV=production webpack --progress --hide-modules" 12 | }, 13 | "repository": { 14 | "type": "git", 15 | "url": "git+https://github.com/panda-fe/panda-vue" 16 | }, 17 | "dependencies": { 18 | "vue": "^2.5.11" 19 | }, 20 | "browserslist": [ 21 | "> 1%", 22 | "last 2 versions", 23 | "not ie <= 8" 24 | ], 25 | "keywords": [ 26 | "vue", 27 | "panda" 28 | ], 29 | "bugs": { 30 | "url": "https://github.com/panda-fe/panda-vue/issues" 31 | }, 32 | "peerDependencies": { 33 | "element-ui": "^2.2.1", 34 | "vue": "^2.5.11" 35 | }, 36 | "devDependencies": { 37 | "babel-core": "^6.26.0", 38 | "babel-loader": "^7.1.2", 39 | "babel-preset-env": "^1.6.0", 40 | "babel-preset-stage-3": "^6.24.1", 41 | "cross-env": "^5.0.5", 42 | "css-loader": "^0.28.7", 43 | "file-loader": "^1.1.4", 44 | "node-sass": "^4.9.2", 45 | "sass-loader": "^7.0.3", 46 | "vue-loader": "^13.0.5", 47 | "vue-template-compiler": "^2.4.4", 48 | "webpack": "^3.6.0", 49 | "webpack-dev-server": "^2.9.1" 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /packages/basictable/index.js: -------------------------------------------------------------------------------- 1 | import BasicTable from './src/main.vue'; 2 | 3 | /* istanbul ignore next */ 4 | BasicTable.install = function(Vue) { 5 | Vue.component(BasicTable.name, BasicTable) 6 | } 7 | 8 | export default BasicTable 9 | -------------------------------------------------------------------------------- /packages/basictable/src/main.vue: -------------------------------------------------------------------------------- 1 | /** 2 | * 创建于 2018/1/23 3 | * 作者: Xinwang 4 | * 功能: 基础表格组件 5 | */ 6 | 7 | 124 | 125 | 258 | 259 | 268 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import BasicTable from '../packages/basictable/index.js' 2 | 3 | import packageInfo from '../package.json' 4 | 5 | const components = [ 6 | BasicTable 7 | ] 8 | 9 | const install = function(Vue, opts = {}) { 10 | 11 | // 组件统一载入 12 | components.map(component => { 13 | Vue.component(component.name, component) 14 | }) 15 | 16 | // 1. 添加全局方法或属性,如: vue-custom-element 17 | // Vue.myGlobalMethod = function () { 18 | // // 逻辑... 19 | // } 20 | 21 | // 2. 添加全局资源:指令/过滤器/过渡等,如 vue-touch 22 | // Vue.directive('my-directive', { 23 | // bind (el, binding, vnode, oldVnode) { 24 | // // 逻辑... 25 | // } 26 | // }) 27 | 28 | // 3. 通过全局 mixin方法添加一些组件选项,如: vuex 29 | // Vue.mixin({ 30 | // created: function () { 31 | // // 逻辑... 32 | // } 33 | // }) 34 | 35 | // 4. 添加实例方法,通过把它们添加到 Vue.prototype 上实现 36 | // Vue.prototype.$myMethod = function (options) { 37 | // // 逻辑... 38 | // } 39 | } 40 | 41 | /* istanbul ignore if */ 42 | if (typeof window !== 'undefined' && window.Vue) { 43 | install(window.Vue) 44 | } 45 | 46 | export default { 47 | version: packageInfo.version, 48 | install, 49 | BasicTable 50 | } 51 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var webpack = require('webpack') 3 | 4 | function resolve(dir) { 5 | return path.join(__dirname, '..', dir) 6 | } 7 | 8 | module.exports = { 9 | entry: './src/index.js', 10 | output: { 11 | path: path.resolve(__dirname, './dist'), 12 | publicPath: '/dist/', 13 | filename: 'panda-vue.js', 14 | library: 'panda-vue', 15 | libraryTarget: 'umd', 16 | umdNamedDefine: true 17 | }, 18 | module: { 19 | rules: [ 20 | { 21 | test: /\.css$/, 22 | use: [ 23 | 'vue-style-loader', 24 | 'css-loader' 25 | ] 26 | }, { 27 | test: /\.vue$/, 28 | loader: 'vue-loader', 29 | options: { 30 | loaders: {} 31 | // other vue-loader options go here 32 | } 33 | }, 34 | { 35 | test: /\.js$/, 36 | loader: 'babel-loader', 37 | exclude: /node_modules/ 38 | }, 39 | { 40 | test: /\.(png|jpg|gif|svg)$/, 41 | loader: 'file-loader', 42 | options: { 43 | name: '[name].[ext]?[hash]' 44 | } 45 | } 46 | ] 47 | }, 48 | resolve: { 49 | alias: { 50 | 'vue$': 'vue/dist/vue.esm.js', 51 | '@': resolve('src'), 52 | 'mixins': 'src/mixins', 53 | 'packages': 'src/packages' 54 | }, 55 | extensions: ['*', '.js', '.vue', '.json'] 56 | }, 57 | devServer: { 58 | historyApiFallback: true, 59 | noInfo: true, 60 | overlay: true 61 | }, 62 | performance: { 63 | hints: false 64 | }, 65 | devtool: '#eval-source-map' 66 | } 67 | 68 | if (process.env.NODE_ENV === 'production') { 69 | module.exports.devtool = '#source-map' 70 | // http://vue-loader.vuejs.org/en/workflow/production.html 71 | module.exports.plugins = (module.exports.plugins || []).concat([ 72 | new webpack.DefinePlugin({ 73 | 'process.env': { 74 | NODE_ENV: '"production"' 75 | } 76 | }), 77 | new webpack.optimize.UglifyJsPlugin({ 78 | sourceMap: true, 79 | compress: { 80 | warnings: false 81 | } 82 | }), 83 | new webpack.LoaderOptionsPlugin({ 84 | minimize: true 85 | }) 86 | ]) 87 | } 88 | --------------------------------------------------------------------------------