mirror of https://github.com/fatedier/frp
commit
ea79e03bd0
Binary file not shown.
Binary file not shown.
|
@ -1 +1 @@
|
||||||
<!DOCTYPE html> <html lang=en> <head> <meta charset=utf-8> <title>frps dashboard</title> <link rel="shortcut icon" href="favicon.ico"></head> <body> <div id=app></div> <script type="text/javascript" src="manifest.js?19fe692a133073fc0250"></script><script type="text/javascript" src="vendor.js?c2d294f9c0a40fd7073a"></script><script type="text/javascript" src="index.js?0165797ab12e44b1e1ed"></script></body> </html>
|
<!DOCTYPE html> <html lang=en> <head> <meta charset=utf-8> <title>frps dashboard</title> <link rel="shortcut icon" href="favicon.ico"></head> <body> <div id=app></div> <script type="text/javascript" src="manifest.js?b90a32ccfb87def61aaa"></script><script type="text/javascript" src="vendor.js?f04985ef00f520142368"></script></body> </html>
|
File diff suppressed because one or more lines are too long
|
@ -1 +1 @@
|
||||||
!function(e){function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var r=window.webpackJsonp;window.webpackJsonp=function(t,c,u){for(var a,i,f,l=0,s=[];l<t.length;l++)i=t[l],o[i]&&s.push(o[i][0]),o[i]=0;for(a in c)Object.prototype.hasOwnProperty.call(c,a)&&(e[a]=c[a]);for(r&&r(t,c,u);s.length;)s.shift()();if(u)for(l=0;l<u.length;l++)f=n(n.s=u[l]);return f};var t={},o={2:0};n.e=function(e){function r(){a.onerror=a.onload=null,clearTimeout(i);var n=o[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}var t=o[e];if(0===t)return new Promise(function(e){e()});if(t)return t[2];var c=new Promise(function(n,r){t=o[e]=[n,r]});t[2]=c;var u=document.getElementsByTagName("head")[0],a=document.createElement("script");a.type="text/javascript",a.charset="utf-8",a.async=!0,a.timeout=12e4,n.nc&&a.setAttribute("nonce",n.nc),a.src=n.p+""+e+".js?"+{0:"0165797ab12e44b1e1ed",1:"c2d294f9c0a40fd7073a"}[e];var i=setTimeout(r,12e4);return a.onerror=a.onload=r,u.appendChild(a),c},n.m=e,n.c=t,n.i=function(e){return e},n.d=function(e,r,t){n.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:t})},n.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(r,"a",r),r},n.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},n.p="",n.oe=function(e){throw console.error(e),e}}([]);
|
!function(e){function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var r=window.webpackJsonp;window.webpackJsonp=function(t,u,c){for(var i,a,f,l=0,s=[];l<t.length;l++)a=t[l],o[a]&&s.push(o[a][0]),o[a]=0;for(i in u)Object.prototype.hasOwnProperty.call(u,i)&&(e[i]=u[i]);for(r&&r(t,u,c);s.length;)s.shift()();if(c)for(l=0;l<c.length;l++)f=n(n.s=c[l]);return f};var t={},o={1:0};n.e=function(e){function r(){i.onerror=i.onload=null,clearTimeout(a);var n=o[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}var t=o[e];if(0===t)return new Promise(function(e){e()});if(t)return t[2];var u=new Promise(function(n,r){t=o[e]=[n,r]});t[2]=u;var c=document.getElementsByTagName("head")[0],i=document.createElement("script");i.type="text/javascript",i.charset="utf-8",i.async=!0,i.timeout=12e4,n.nc&&i.setAttribute("nonce",n.nc),i.src=n.p+""+e+".js?"+{0:"f04985ef00f520142368"}[e];var a=setTimeout(r,12e4);return i.onerror=i.onload=r,c.appendChild(i),u},n.m=e,n.c=t,n.i=function(e){return e},n.d=function(e,r,t){n.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:t})},n.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(r,"a",r),r},n.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},n.p="",n.oe=function(e){throw console.error(e),e}}([]);
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -69,6 +69,7 @@ var (
|
||||||
sk string
|
sk string
|
||||||
serverName string
|
serverName string
|
||||||
bindAddr string
|
bindAddr string
|
||||||
|
bindPort int
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|
|
@ -39,7 +39,8 @@ func init() {
|
||||||
stcpCmd.PersistentFlags().StringVarP(&serverName, "server_name", "", "", "server name")
|
stcpCmd.PersistentFlags().StringVarP(&serverName, "server_name", "", "", "server name")
|
||||||
stcpCmd.PersistentFlags().StringVarP(&localIp, "local_ip", "i", "127.0.0.1", "local ip")
|
stcpCmd.PersistentFlags().StringVarP(&localIp, "local_ip", "i", "127.0.0.1", "local ip")
|
||||||
stcpCmd.PersistentFlags().IntVarP(&localPort, "local_port", "l", 0, "local port")
|
stcpCmd.PersistentFlags().IntVarP(&localPort, "local_port", "l", 0, "local port")
|
||||||
stcpCmd.PersistentFlags().StringVarP(&bindAddr, "bind_addr", "", "", "bind addr such as 127.0.0.1:9000")
|
stcpCmd.PersistentFlags().StringVarP(&bindAddr, "bind_addr", "", "", "bind addr")
|
||||||
|
stcpCmd.PersistentFlags().IntVarP(&bindPort, "bind_port", "", 0, "bind port")
|
||||||
stcpCmd.PersistentFlags().BoolVarP(&useEncryption, "ue", "", false, "use encryption")
|
stcpCmd.PersistentFlags().BoolVarP(&useEncryption, "ue", "", false, "use encryption")
|
||||||
stcpCmd.PersistentFlags().BoolVarP(&useCompression, "uc", "", false, "use compression")
|
stcpCmd.PersistentFlags().BoolVarP(&useCompression, "uc", "", false, "use compression")
|
||||||
|
|
||||||
|
@ -69,6 +70,7 @@ var stcpCmd = &cobra.Command{
|
||||||
cfg.LocalIp = localIp
|
cfg.LocalIp = localIp
|
||||||
cfg.LocalPort = localPort
|
cfg.LocalPort = localPort
|
||||||
cfg.BindAddr = bindAddr
|
cfg.BindAddr = bindAddr
|
||||||
|
cfg.BindPort = bindPort
|
||||||
cfg.UseEncryption = useEncryption
|
cfg.UseEncryption = useEncryption
|
||||||
cfg.UseCompression = useCompression
|
cfg.UseCompression = useCompression
|
||||||
|
|
||||||
|
|
|
@ -39,7 +39,8 @@ func init() {
|
||||||
xtcpCmd.PersistentFlags().StringVarP(&serverName, "server_name", "", "", "server name")
|
xtcpCmd.PersistentFlags().StringVarP(&serverName, "server_name", "", "", "server name")
|
||||||
xtcpCmd.PersistentFlags().StringVarP(&localIp, "local_ip", "i", "127.0.0.1", "local ip")
|
xtcpCmd.PersistentFlags().StringVarP(&localIp, "local_ip", "i", "127.0.0.1", "local ip")
|
||||||
xtcpCmd.PersistentFlags().IntVarP(&localPort, "local_port", "l", 0, "local port")
|
xtcpCmd.PersistentFlags().IntVarP(&localPort, "local_port", "l", 0, "local port")
|
||||||
xtcpCmd.PersistentFlags().StringVarP(&bindAddr, "bind_addr", "", "", "bind addr such as 127.0.0.1:9000")
|
xtcpCmd.PersistentFlags().StringVarP(&bindAddr, "bind_addr", "", "", "bind addr")
|
||||||
|
xtcpCmd.PersistentFlags().IntVarP(&bindPort, "bind_port", "", 0, "bind port")
|
||||||
xtcpCmd.PersistentFlags().BoolVarP(&useEncryption, "ue", "", false, "use encryption")
|
xtcpCmd.PersistentFlags().BoolVarP(&useEncryption, "ue", "", false, "use encryption")
|
||||||
xtcpCmd.PersistentFlags().BoolVarP(&useCompression, "uc", "", false, "use compression")
|
xtcpCmd.PersistentFlags().BoolVarP(&useCompression, "uc", "", false, "use compression")
|
||||||
|
|
||||||
|
@ -69,6 +70,7 @@ var xtcpCmd = &cobra.Command{
|
||||||
cfg.LocalIp = localIp
|
cfg.LocalIp = localIp
|
||||||
cfg.LocalPort = localPort
|
cfg.LocalPort = localPort
|
||||||
cfg.BindAddr = bindAddr
|
cfg.BindAddr = bindAddr
|
||||||
|
cfg.BindPort = bindPort
|
||||||
cfg.UseEncryption = useEncryption
|
cfg.UseEncryption = useEncryption
|
||||||
cfg.UseCompression = useCompression
|
cfg.UseCompression = useCompression
|
||||||
|
|
||||||
|
|
|
@ -675,6 +675,10 @@ func (cfg *StcpProxyConf) CheckForCli() (err error) {
|
||||||
err = fmt.Errorf("bind_addr shouldn't be empty")
|
err = fmt.Errorf("bind_addr shouldn't be empty")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if cfg.BindPort == 0 {
|
||||||
|
err = fmt.Errorf("bind_port should be set")
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -777,6 +781,10 @@ func (cfg *XtcpProxyConf) CheckForCli() (err error) {
|
||||||
err = fmt.Errorf("bind_addr shouldn't be empty")
|
err = fmt.Errorf("bind_addr shouldn't be empty")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if cfg.BindPort == 0 {
|
||||||
|
err = fmt.Errorf("bind_port should be set")
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -106,10 +106,17 @@ func (nc *NatHoleController) HandleVisitor(m *msg.NatHoleVisitor, raddr *net.UDP
|
||||||
}
|
}
|
||||||
nc.mu.Lock()
|
nc.mu.Lock()
|
||||||
clientCfg, ok := nc.clientCfgs[m.ProxyName]
|
clientCfg, ok := nc.clientCfgs[m.ProxyName]
|
||||||
if !ok || m.SignKey != util.GetAuthKey(clientCfg.Sk, m.Timestamp) {
|
if !ok {
|
||||||
nc.mu.Unlock()
|
nc.mu.Unlock()
|
||||||
|
log.Debug("xtcp server for [%s] doesn't exist", m.ProxyName)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if m.SignKey != util.GetAuthKey(clientCfg.Sk, m.Timestamp) {
|
||||||
|
nc.mu.Unlock()
|
||||||
|
log.Debug("xtcp connection of [%s] auth failed", m.ProxyName)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
nc.sessions[sid] = session
|
nc.sessions[sid] = session
|
||||||
nc.mu.Unlock()
|
nc.mu.Unlock()
|
||||||
log.Trace("handle visitor message, sid [%s]", sid)
|
log.Trace("handle visitor message, sid [%s]", sid)
|
||||||
|
|
|
@ -1,5 +1,14 @@
|
||||||
{
|
{
|
||||||
"presets": [
|
"presets": [
|
||||||
["es2015", { "modules": false }]
|
["es2015", { "modules": false }]
|
||||||
|
],
|
||||||
|
"plugins": [
|
||||||
|
[
|
||||||
|
"component",
|
||||||
|
{
|
||||||
|
"libraryName": "element-ui",
|
||||||
|
"styleLibraryName": "theme-chalk"
|
||||||
|
}
|
||||||
|
]
|
||||||
]
|
]
|
||||||
}
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -10,9 +10,9 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"bootstrap": "^3.3.7",
|
"bootstrap": "^3.3.7",
|
||||||
"echarts": "^3.5.0",
|
"echarts": "^3.5.0",
|
||||||
"element-ui": "^1.2.5",
|
"element-ui": "^2.3.8",
|
||||||
"humanize-plus": "^1.8.2",
|
"humanize-plus": "^1.8.2",
|
||||||
"vue": "^2.2.4",
|
"vue": "^2.5.16",
|
||||||
"vue-resource": "^1.2.1",
|
"vue-resource": "^1.2.1",
|
||||||
"vue-router": "^2.3.0",
|
"vue-router": "^2.3.0",
|
||||||
"whatwg-fetch": "^2.0.3"
|
"whatwg-fetch": "^2.0.3"
|
||||||
|
@ -25,6 +25,7 @@
|
||||||
"babel-core": "^6.21.0",
|
"babel-core": "^6.21.0",
|
||||||
"babel-eslint": "^7.1.1",
|
"babel-eslint": "^7.1.1",
|
||||||
"babel-loader": "^6.4.0",
|
"babel-loader": "^6.4.0",
|
||||||
|
"babel-plugin-component": "^1.1.1",
|
||||||
"babel-preset-es2015": "^6.13.2",
|
"babel-preset-es2015": "^6.13.2",
|
||||||
"css-loader": "^0.27.0",
|
"css-loader": "^0.27.0",
|
||||||
"eslint": "^3.12.2",
|
"eslint": "^3.12.2",
|
||||||
|
@ -38,10 +39,10 @@
|
||||||
"postcss-loader": "^1.3.3",
|
"postcss-loader": "^1.3.3",
|
||||||
"rimraf": "^2.5.4",
|
"rimraf": "^2.5.4",
|
||||||
"style-loader": "^0.13.2",
|
"style-loader": "^0.13.2",
|
||||||
"url-loader": "^0.5.8",
|
"url-loader": "^1.0.1",
|
||||||
"vue-loader": "^11.1.4",
|
"vue-loader": "^15.0.10",
|
||||||
"vue-template-compiler": "^2.1.8",
|
"vue-template-compiler": "^2.1.8",
|
||||||
"webpack": "^2.2.0-rc.4",
|
"webpack": "^2.2.0-rc.4",
|
||||||
"webpack-dev-server": "^2.11.0"
|
"webpack-dev-server": "^3.1.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
<div>
|
<div>
|
||||||
<el-table :data="proxies" :default-sort="{prop: 'name', order: 'ascending'}" style="width: 100%">
|
<el-table :data="proxies" :default-sort="{prop: 'name', order: 'ascending'}" style="width: 100%">
|
||||||
<el-table-column type="expand">
|
<el-table-column type="expand">
|
||||||
<template scope="props">
|
<template slot-scope="props">
|
||||||
<el-popover
|
<el-popover
|
||||||
ref="popover4"
|
ref="popover4"
|
||||||
placement="right"
|
placement="right"
|
||||||
|
@ -79,7 +79,7 @@
|
||||||
label="status"
|
label="status"
|
||||||
prop="status"
|
prop="status"
|
||||||
sortable>
|
sortable>
|
||||||
<template scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-tag type="success" v-if="scope.row.status === 'online'">{{ scope.row.status }}</el-tag>
|
<el-tag type="success" v-if="scope.row.status === 'online'">{{ scope.row.status }}</el-tag>
|
||||||
<el-tag type="danger" v-else>{{ scope.row.status }}</el-tag>
|
<el-tag type="danger" v-else>{{ scope.row.status }}</el-tag>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
<div>
|
<div>
|
||||||
<el-table :data="proxies" :default-sort="{prop: 'name', order: 'ascending'}" style="width: 100%">
|
<el-table :data="proxies" :default-sort="{prop: 'name', order: 'ascending'}" style="width: 100%">
|
||||||
<el-table-column type="expand">
|
<el-table-column type="expand">
|
||||||
<template scope="props">
|
<template slot-scope="props">
|
||||||
<el-popover
|
<el-popover
|
||||||
ref="popover4"
|
ref="popover4"
|
||||||
placement="right"
|
placement="right"
|
||||||
|
@ -73,7 +73,7 @@
|
||||||
label="status"
|
label="status"
|
||||||
prop="status"
|
prop="status"
|
||||||
sortable>
|
sortable>
|
||||||
<template scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-tag type="success" v-if="scope.row.status === 'online'">{{ scope.row.status }}</el-tag>
|
<el-tag type="success" v-if="scope.row.status === 'online'">{{ scope.row.status }}</el-tag>
|
||||||
<el-tag type="danger" v-else>{{ scope.row.status }}</el-tag>
|
<el-tag type="danger" v-else>{{ scope.row.status }}</el-tag>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
<div>
|
<div>
|
||||||
<el-table :data="proxies" :default-sort="{prop: 'name', order: 'ascending'}" style="width: 100%">
|
<el-table :data="proxies" :default-sort="{prop: 'name', order: 'ascending'}" style="width: 100%">
|
||||||
<el-table-column type="expand">
|
<el-table-column type="expand">
|
||||||
<template scope="props">
|
<template slot-scope="props">
|
||||||
<el-popover
|
<el-popover
|
||||||
ref="popover4"
|
ref="popover4"
|
||||||
placement="right"
|
placement="right"
|
||||||
|
@ -70,7 +70,7 @@
|
||||||
label="status"
|
label="status"
|
||||||
prop="status"
|
prop="status"
|
||||||
sortable>
|
sortable>
|
||||||
<template scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-tag type="success" v-if="scope.row.status === 'online'">{{ scope.row.status }}</el-tag>
|
<el-tag type="success" v-if="scope.row.status === 'online'">{{ scope.row.status }}</el-tag>
|
||||||
<el-tag type="danger" v-else>{{ scope.row.status }}</el-tag>
|
<el-tag type="danger" v-else>{{ scope.row.status }}</el-tag>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
<div>
|
<div>
|
||||||
<el-table :data="proxies" :default-sort="{prop: 'name', order: 'ascending'}" style="width: 100%">
|
<el-table :data="proxies" :default-sort="{prop: 'name', order: 'ascending'}" style="width: 100%">
|
||||||
<el-table-column type="expand">
|
<el-table-column type="expand">
|
||||||
<template scope="props">
|
<template slot-scope="props">
|
||||||
<el-popover
|
<el-popover
|
||||||
ref="popover4"
|
ref="popover4"
|
||||||
placement="right"
|
placement="right"
|
||||||
|
@ -70,7 +70,7 @@
|
||||||
label="status"
|
label="status"
|
||||||
prop="status"
|
prop="status"
|
||||||
sortable>
|
sortable>
|
||||||
<template scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-tag type="success" v-if="scope.row.status === 'online'">{{ scope.row.status }}</el-tag>
|
<el-tag type="success" v-if="scope.row.status === 'online'">{{ scope.row.status }}</el-tag>
|
||||||
<el-tag type="danger" v-else>{{ scope.row.status }}</el-tag>
|
<el-tag type="danger" v-else>{{ scope.row.status }}</el-tag>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -1,14 +1,43 @@
|
||||||
import Vue from 'vue'
|
import Vue from 'vue'
|
||||||
import ElementUI from 'element-ui'
|
//import ElementUI from 'element-ui'
|
||||||
import locale from 'element-ui/lib/locale/lang/en'
|
import {
|
||||||
import 'element-ui/lib/theme-default/index.css'
|
Button,
|
||||||
|
Form,
|
||||||
|
FormItem,
|
||||||
|
Row,
|
||||||
|
Col,
|
||||||
|
Table,
|
||||||
|
TableColumn,
|
||||||
|
Popover,
|
||||||
|
Menu,
|
||||||
|
Submenu,
|
||||||
|
MenuItem,
|
||||||
|
Tag
|
||||||
|
} from 'element-ui'
|
||||||
|
import lang from 'element-ui/lib/locale/lang/en'
|
||||||
|
import locale from 'element-ui/lib/locale'
|
||||||
|
import 'element-ui/lib/theme-chalk/index.css'
|
||||||
import './utils/less/custom.less'
|
import './utils/less/custom.less'
|
||||||
|
|
||||||
import App from './App.vue'
|
import App from './App.vue'
|
||||||
import router from './router'
|
import router from './router'
|
||||||
import 'whatwg-fetch'
|
import 'whatwg-fetch'
|
||||||
|
|
||||||
Vue.use(ElementUI, { locale })
|
locale.use(lang)
|
||||||
|
|
||||||
|
Vue.use(Button)
|
||||||
|
Vue.use(Form)
|
||||||
|
Vue.use(FormItem)
|
||||||
|
Vue.use(Row)
|
||||||
|
Vue.use(Col)
|
||||||
|
Vue.use(Table)
|
||||||
|
Vue.use(TableColumn)
|
||||||
|
Vue.use(Popover)
|
||||||
|
Vue.use(Menu)
|
||||||
|
Vue.use(Submenu)
|
||||||
|
Vue.use(MenuItem)
|
||||||
|
Vue.use(Tag)
|
||||||
|
|
||||||
Vue.config.productionTip = false
|
Vue.config.productionTip = false
|
||||||
|
|
||||||
new Vue({
|
new Vue({
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
import Vue from 'vue'
|
|
||||||
import ElementUI from 'element-ui'
|
|
|
@ -1,13 +1,13 @@
|
||||||
const path = require('path')
|
const path = require('path')
|
||||||
var webpack = require('webpack')
|
var webpack = require('webpack')
|
||||||
var HtmlWebpackPlugin = require('html-webpack-plugin')
|
var HtmlWebpackPlugin = require('html-webpack-plugin')
|
||||||
|
var VueLoaderPlugin = require('vue-loader/lib/plugin')
|
||||||
var url = require('url')
|
var url = require('url')
|
||||||
var publicPath = ''
|
var publicPath = ''
|
||||||
|
|
||||||
module.exports = (options = {}) => ({
|
module.exports = (options = {}) => ({
|
||||||
entry: {
|
entry: {
|
||||||
vendor: './src/vendor',
|
vendor: './src/main'
|
||||||
index: './src/main.js'
|
|
||||||
},
|
},
|
||||||
output: {
|
output: {
|
||||||
path: path.resolve(__dirname, 'dist'),
|
path: path.resolve(__dirname, 'dist'),
|
||||||
|
@ -25,7 +25,7 @@ module.exports = (options = {}) => ({
|
||||||
module: {
|
module: {
|
||||||
rules: [{
|
rules: [{
|
||||||
test: /\.vue$/,
|
test: /\.vue$/,
|
||||||
use: ['vue-loader']
|
loader: 'vue-loader'
|
||||||
}, {
|
}, {
|
||||||
test: /\.js$/,
|
test: /\.js$/,
|
||||||
use: ['babel-loader'],
|
use: ['babel-loader'],
|
||||||
|
@ -71,7 +71,21 @@ module.exports = (options = {}) => ({
|
||||||
new HtmlWebpackPlugin({
|
new HtmlWebpackPlugin({
|
||||||
favicon: 'src/assets/favicon.ico',
|
favicon: 'src/assets/favicon.ico',
|
||||||
template: 'src/index.html'
|
template: 'src/index.html'
|
||||||
})
|
}),
|
||||||
|
new webpack.NormalModuleReplacementPlugin(/element-ui[\/\\]lib[\/\\]locale[\/\\]lang[\/\\]zh-CN/, 'element-ui/lib/locale/lang/en'),
|
||||||
|
new webpack.DefinePlugin({
|
||||||
|
'process.env': {
|
||||||
|
NODE_ENV: '"production"'
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new webpack.optimize.UglifyJsPlugin({
|
||||||
|
sourceMap: false,
|
||||||
|
comments: false,
|
||||||
|
compress: {
|
||||||
|
warnings: false
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new VueLoaderPlugin()
|
||||||
],
|
],
|
||||||
devServer: {
|
devServer: {
|
||||||
host: '127.0.0.1',
|
host: '127.0.0.1',
|
||||||
|
|
Loading…
Reference in New Issue