如何用webpack4带你实现一个vue的打包的项目


Posted in Javascript onJune 20, 2018

一个用webpack4打包的vue 的项目,参照vue-cli的webpack配置,

一步一步带你实现一个vue的打包的项目,每一个commit对应一个步骤。

github 地址

clone project

git clone git@github.com:naihe138/nvue.git

install

npm install or yarn

一、初始化项目

初始化项目,用vue-loader来打包.vue文件,html-webpack-plugin插件来导出html文件。

第一步我们很简单,就利用vue-loader 和 babel-loader 是把.vue文件打包出来,总共才40多行代码,看build/webpack.base.conf.js文件注释就看的懂。+++表示有省略的代码

module.exports = {
 +++
 // 模块,loader
 module: {
  rules: [
   {
    test: /\.vue$/,
    loader: 'vue-loader',
    exclude: /node_modules/,
    include: resolve('src')
   },
   {
    test: /\.js$/,
    loader: 'babel-loader',
    exclude: /node_modules/,
    include: resolve('src')
   }
  ]
 }
 +++
}

运行 webpack --config build/webpack.base.conf.js

二、打包css和图片等资源

这里打包css以sass 为例,用到了mini-css-extract-plugin插件提取css,用url-loader来处理字体、图片、音频等资源。非常简单。如下代码,+++表示有省略的代码

+++
module.exports = {
 +++
 // 模块,loader
 module: {
  rules: [
   +++
   {
    test: /\.s?css$/,
    use: [
     MiniCssExtractPlugin.loader,
     'css-loader',
     'sass-loader'
    ]
   },
   {
    test: /.(png|jpe?g|gif|svg)(\?.*)?$/,
    loader: 'url-loader',
    options: {
     limit: 10000,
     name: 'static/img/[name].[hash:7].[ext]'
    }
   }
   +++
  ]
 },
 // 插件
 plugins: [
  +++
  new MiniCssExtractPlugin({
   filename: 'static/css/[name].[hash].css',
   chunkFilename: 'static/css/[name].[hash].css'
  })
 ]
}

运行 webpack --config build/webpack.base.conf.js

三、配置热加载、代理等开发环境

通过build/config.js来设置开发配置。如下注释

const path = require('path')

module.exports = {
 dev: {
  assetsSubDirectory: 'static', // 静态文件目录
  assetsPublicPath: '/', // 相对文件路径
  proxyTable: {},
  host: 'localhost',
  port: '8000',
  autoOpenBrowser: false, // 是否自动打开浏览器
  errorOverlay: true, // 浏览器错误提示遮罩层
  notifyOnErrors: true, // 编译错误的时候通知提示,需要friendly-errors-webpack-plugin 配合
  poll: false,
  useEslint: true, // 便宜使用eslint-loader模块
  showEslintErrorsInOverlay: false, // eslint浏览器错误提示遮罩层
  devtool: 'cheap-module-eval-source-map', // Source Maps
  cssSourceMap: true, // css Source Maps
  cacheBusting: false, // vue debugg 提示
 }
}

webpack.dev.conf.js中,通过webpack-dev-server 插件来开启热重载服务,同时配置自动补全css兼容代码的插件,postcss-loader

运行npm run dev 或者 yarn dev 就可以启动服务了

四、配置打包环境

通过build/config.js来设置开发配置。如下注释

const path = require('path')

module.exports = {
 +++
 build: {
  // html模板
  index: path.resolve(__dirname, '../dist/index.html'),
  // Paths
  assetsRoot: path.resolve(__dirname, '../dist'),
  assetsSubDirectory: 'static',
  assetsPublicPath: '/',
  // 生产环境的souce map
  productionSourceMap: false,
  devtool: '#source-map',
  // 开启静态文件的Gzip压缩
  // 如果是true 的话 需要 npm install --save-dev compression-webpack-plugin
  productionGzip: false,
  productionGzipExtensions: ['js', 'css'],

  // 打包完成显示包大小的状态分析
  // `npm run build --report`
  bundleAnalyzerReport: process.env.npm_config_report
 }
}

运行npm run build 或者 yarn build 就可以实现打包vue项目啦。

五、检查版本,优化打包输出和Eslint设置

check-version.js中用 shelljs 模块检查时候有npm命令, semver模块语义化版本号,然后在build.js合并webpack.prod.conf.js的的配置,然后组在格式化输出。

// 检查时候有安装npm命令
if (shell.which('npm')) {
 versionRequirements.push({
  name: 'npm',
  currentVersion: exec('npm --version'),
  versionRequirement: packageConfig.engines.npm
 })
}

// 格式化输出
process.stdout.write(stats.toString({
 colors: true,
 modules: false,
 children: false,
 chunks: false,
 chunkModules: false
}) + '\n\n')

通过eslint-loader 来配置eslint的检查,建立.eslintrc.js去设置规则

{
 test: /\.(js|vue)$/,
 loader: 'eslint-loader',
 enforce: 'pre',
 include: [resolve('src')],
 exclude: /node_modules/,
 options: {
  formatter: require('eslint-friendly-formatter'),
  emitWarning: !config.dev.showEslintErrorsInOverlay
 }
},

六、打包优化

1、添加DllPlugin和DllReferencePlugin来打包优化不变的库,
2、通过cache-loader来做loader的缓存,
3、通过UglifyJsPlugin的parallel来开启多线程打包

先运行npm run dll 然后 npm run build

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
fckeditor 获取文本框值的实现代码
Feb 09 Javascript
JavaScript中:表达式和语句的区别[译]
Sep 17 Javascript
扩展jQuery对象时如何扩展成员变量具体怎么实现
Apr 25 Javascript
JS组件Bootstrap dropdown组件扩展hover事件
Apr 17 Javascript
JS组件Bootstrap实现弹出框效果代码
Apr 26 Javascript
两种JavaScript的AES加密方式(可与Java相互加解密)
Aug 02 Javascript
bootstrap suggest搜索建议插件使用详解
Mar 25 Javascript
如何使用angularJs
May 08 Javascript
bootstrap响应式表格实例详解
May 15 Javascript
vue.js项目nginx部署教程
Apr 05 Javascript
解决layui表格内文本超出隐藏的问题
Sep 12 Javascript
Vue CLI中模式与环境变量的深入详解
May 30 Vue.js
JavaScript对象拷贝与Object.assign用法实例分析
Jun 20 #Javascript
vue打包的时候自动将px转成rem的操作方法
Jun 20 #Javascript
详解基于vue的服务端渲染框架NUXT
Jun 20 #Javascript
JS中call和apply函数用法实例分析
Jun 20 #Javascript
微信小程序模拟cookie的实现
Jun 20 #Javascript
JS伪继承prototype实现方法示例
Jun 20 #Javascript
通过jquery.cookie.js实现记住用户名、密码登录功能
Jun 20 #jQuery
You might like
Excel数据导入Mysql数据库的实现代码
2008/06/05 PHP
php适配器模式介绍
2012/08/14 PHP
ThinkPHP中redirect用法分析
2014/12/05 PHP
PHP实现的简单异常处理类示例
2017/05/04 PHP
PHP 构造函数和析构函数原理与用法分析
2020/04/21 PHP
js输出数据精确到小数点后n位代码
2016/07/02 Javascript
JS表格组件神器bootstrap table使用指南详解
2017/04/12 Javascript
Angular 4依赖注入学习教程之组件服务注入(二)
2017/06/04 Javascript
微信小程序 如何保持登录状态
2019/08/16 Javascript
vue实现页面滚动到底部刷新
2019/08/16 Javascript
jquery validate 实现动态增加/删除验证规则操作示例
2019/10/28 jQuery
js实现时间日期校验
2020/05/26 Javascript
[01:33:59]真人秀《加油 DOTA》 第六期
2014/09/09 DOTA
[01:44]Ti10举办地公布
2019/08/25 DOTA
[40:53]完美世界DOTA2联赛PWL S3 Magma vs DLG 第二场 12.18
2020/12/20 DOTA
python通过shutil实现快速文件复制的方法
2015/03/14 Python
windows10系统中安装python3.x+scrapy教程
2016/11/08 Python
python实现上传下载文件功能
2020/11/19 Python
在python中利用KNN实现对iris进行分类的方法
2018/12/11 Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
2020/02/04 Python
你可能不熟练的十个前端HTML5经典面试题
2018/07/03 HTML / CSS
澳大利亚领先的运动鞋商店:Hype DC
2018/03/31 全球购物
台湾全方位线上课程与职能学习平台:TibaMe
2019/12/04 全球购物
一套带答案的C++笔试题
2014/01/10 面试题
采购员岗位职责
2013/11/15 职场文书
生日宴会答谢词
2014/01/09 职场文书
中学生评语大全
2014/04/18 职场文书
服务标语大全
2014/06/18 职场文书
收款授权委托书
2014/10/02 职场文书
家庭暴力离婚起诉书
2015/05/18 职场文书
2016年元旦主持词
2015/07/06 职场文书
校运会新闻稿
2015/07/17 职场文书
2016年推广普通话宣传周活动总结
2016/04/06 职场文书
导游词之湖北武当山
2019/09/23 职场文书
pytorch中Schedule与warmup_steps的用法说明
2021/05/24 Python
postgresql无序uuid性能测试及对数据库的影响
2021/06/11 PostgreSQL