cdn方式引用包
- 在入口文件引入第三方cdn资源(
无需再通过npm i 方式下载,如element-ui vue-router axios vuex等)
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title><%= htmlWebpackPlugin.options.title %></title>
<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
<script src="https://cdn.staticfile.org/vue/2.6.11/vue.min.js"></script>
<script src="https://cdn.staticfile.org/axios/0.24.0/axios.min.js"></script>
<script src="https://cdn.staticfile.org/vue-router/3.5.3/vue-router.min.js"></script>
<script src="https://cdn.staticfile.org/vuex/3.6.2/vuex.min.js"></script>
<script src="https://unpkg.com/element-ui/lib/index.js"></script>
</head>
<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled.
Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
</body>
</html>
module.exports = {
configureWebpack: {
externals: {
'vue': 'Vue',
'vue-router': 'VueRouter',
'axios': 'axios',
'vuex': 'Vuex',
'element-ui@': 'ELEMENT'
}
}
}
import Vue from 'vue'
import App from './App.vue'
import ElementUI from 'element-ui@';
Vue.use(ElementUI);
Vue.config.productionTip = false
new Vue({
render: h => h(App),
}).$mount('#app')
vue-cli3下vue.config.js常用配置
module.exports = {
productionSourceMap: false,
publicPath: process.env.NODE_ENV === 'production' ? '/dist' : '/',
outputDir: 'dist',
lintOnSave: false,
pages: {
login: {
entry: 'src/login/main.js',
template: 'public/login.html'
},
index: {
entry: 'src/index/main.js',
template: 'public/index.html'
}
},
configureWebpack: {
externals: {
'echarts': 'echarts'
},
},
devServer: {
host: '0.0.0.0',
port: 8081,
proxy: {
'/api': {
target: "api-url",
secure: false,
ws: true,
changeOrigin: true,
pathRewrite: {
'^/api': '/',
}
}
}
}
}
vue2下vue.config.js常用生产环境优化性能配置
const path = require('path');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
const CompressionWebpackPlugin = require('compression-webpack-plugin');
const { HashedModuleIdsPlugin } = require('webpack');
function resolve (dir) {
return path.join(__dirname, dir)
}
const isProduction = true
const externals = {
'vue': 'Vue',
'vue-router': 'VueRouter',
'vuex': 'Vuex',
'axios': 'axios',
"element-ui": "ELEMENT"
}
const cdnResource = {
css: [
'https://unpkg.com/element-ui/lib/theme-chalk/index.css'
],
js: [
'https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.min.js',
'https://cdn.jsdelivr.net/npm/vue-router@3.0.1/dist/vue-router.min.js',
'https://cdn.jsdelivr.net/npm/vuex@3.0.1/dist/vuex.min.js',
'https://cdn.jsdelivr.net/npm/axios@0.18.0/dist/axios.min.js',
'https://unpkg.com/element-ui/lib/index.js'
]
}
module.exports = {
lintOnSave: false,
productionSourceMap: false,
publicPath: './',
outputDir: process.env.outputDir,
chainWebpack: config => {
config.resolve.alias
.set('@', resolve('src'))
config.module
.rule('images')
.test(/\.(png|jpe?g|gif|svg)(\?.*)?$/)
.use('image-webpack-loader')
.loader('image-webpack-loader')
.options({ bypassOnDebug: true })
config.optimization.delete('splitChunks')
config.plugin('html').tap(args => {
args[0].cdn = cdnResource
return args
})
config
.plugin('webpack-bundle-analyzer')
.use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin)
},
configureWebpack: config => {
const plugins = [];
if (isProduction) {
plugins.push(
new UglifyJsPlugin({
uglifyOptions: {
output: {
comments: false,
},
warnings: false,
compress: {
drop_console: true,
drop_debugger: false,
pure_funcs: ['console.log']
}
}
})
)
plugins.push(
new CompressionWebpackPlugin({
algorithm: 'gzip',
test: /\.(js|css)$/,
threshold: 10000,
deleteOriginalAssets: false,
minRatio: 0.8
})
)
plugins.push(
new HashedModuleIdsPlugin()
)
config.optimization = {
runtimeChunk: 'single',
splitChunks: {
chunks: 'all',
maxInitialRequests: Infinity,
minSize: 1000 * 60,
cacheGroups: {
vendor: {
test: /[\\/]node_modules[\\/]/,
name (module) {
const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1]
return `npm.${packageName.replace('@', '')}`
}
}
}
}
};
config.performance = {
hints: 'warning',
maxEntrypointSize: 1000 * 500,
maxAssetSize: 1000 * 1000,
assetFilter: function (assetFilename) {
return assetFilename.endsWith('.js');
}
}
config.externals = externals;
}
return { plugins }
},
devServer: {
host: '0.0.0.0',
port: 8081,
proxy: {
'/api': {
target: "api-url",
secure: false,
ws: true,
changeOrigin: true,
pathRewrite: {
'^/api': '/',
}
}
}
}
}
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title><%= htmlWebpackPlugin.options.title %></title>
<% for (var i in
htmlWebpackPlugin.options.cdn&&htmlWebpackPlugin.options.cdn.css) { %>
<link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="preload" as="style" />
<link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="stylesheet" />
<% } %>
<% for (var i in
htmlWebpackPlugin.options.cdn&&htmlWebpackPlugin.options.cdn.js) { %>
<script src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script>
<% } %>
</head>
<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled.
Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
</body>
</html>
- 步骤3.package.json注意插件对应的版本,版本问题也会导致编译失败
{
"name": "vue2x",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint"
},
"dependencies": {
"core-js": "^3.6.5",
"vue": "^2.6.11"
},
"devDependencies": {
"@vue/cli-plugin-babel": "~4.5.19",
"@vue/cli-plugin-eslint": "~4.5.19",
"@vue/cli-service": "~4.5.19",
"babel-eslint": "^10.1.0",
"compression-webpack-plugin": "^6.1.1",
"eslint": "^6.7.2",
"eslint-plugin-vue": "^6.2.2",
"uglifyjs-webpack-plugin": "^2.2.0",
"vue-template-compiler": "^2.6.11",
"webpack": "^4.46.0"
},
"eslintConfig": {
"root": true,
"env": {
"node": true
},
"extends": [
"plugin:vue/essential",
"eslint:recommended"
],
"parserOptions": {
"parser": "babel-eslint"
},
"rules": {}
},
"browserslist": [
"> 1%",
"last 2 versions",
"not dead"
]
}
import Vue from 'vue'
import App from './App.vue'
import ElementUI from 'element-ui';
Vue.use(ElementUI);
Vue.config.productionTip = false
console.log('main.js log')
new Vue({
render: h => h(App),
}).$mount('#app')
template>
<div id="app">
<el-button type="primary">主要按钮</el-button>
</div>
</template>