如何用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 相关文章推荐
javascript 主动派发事件总结
Aug 09 Javascript
Javascript对象中关于setTimeout和setInterval的this介绍
Jul 21 Javascript
JS根据年月获得当月天数的实现代码
Jul 03 Javascript
javaScript知识点总结(必看篇)
Jun 10 Javascript
Angular2表单自定义验证器的实现
Oct 19 Javascript
javascript实现简单的可随机变色网页计算器示例
Dec 30 Javascript
Angularjs 实现动态添加控件功能
May 25 Javascript
JavaScript设计模式之缓存代理模式原理与简单用法示例
Aug 07 Javascript
vue.js指令v-for使用以及下标索引的获取
Jan 31 Javascript
layui 实现自动选择radio单选框(checked)的方法
Sep 03 Javascript
VUE项目初建和常见问题总结
Sep 12 Javascript
vue和iview实现Scroll 数据无限滚动功能
Oct 31 Javascript
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
PHP date函数参数详解
2006/11/27 PHP
php线性表顺序存储实现代码(增删查改)
2012/02/16 PHP
浅析PHP7的多进程及实例源码
2019/04/14 PHP
jquery简单实现鼠标经过导航条改变背景图
2013/12/17 Javascript
IE6-IE9中tbody的innerHTML不能赋值的解决方法
2014/09/26 Javascript
jQuery实现数字加减效果汇总
2014/12/16 Javascript
Javascript 拖拽雏形中的一些问题(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
jquery解析json格式数据的方法(对象、字符串)
2015/11/24 Javascript
IE下JS保存图片的简单实例
2016/07/15 Javascript
使用HTML5+Boostrap打造简单的音乐播放器
2016/08/05 Javascript
原生JS实现网络彩票投注效果
2016/09/25 Javascript
JS复制对应id的内容到粘贴板(Ctrl+C效果)
2017/01/23 Javascript
webpack公共组件引用路径简化小技巧
2018/06/15 Javascript
Python打包可执行文件的方法详解
2016/09/19 Python
Python实现pdf文档转txt的方法示例
2018/01/19 Python
解决python tkinter界面卡死的问题
2019/07/17 Python
Django 通过JS实现ajax过程详解
2019/07/30 Python
利用Python脚本实现自动刷网课
2020/02/03 Python
Anaconda的安装与虚拟环境建立
2020/11/18 Python
使用HTML5技术开发一个属于自己的超酷颜色选择器
2013/09/22 HTML / CSS
瑜伽灵感珠宝:Satya Jewelry
2018/01/06 全球购物
开放系统互连参考模型
2016/06/29 面试题
仓库管理制度
2014/01/21 职场文书
房地产资料员岗位职责
2014/07/02 职场文书
动漫设计与制作专业推荐信
2014/07/07 职场文书
装修活动策划方案
2014/08/27 职场文书
五四演讲稿范文
2014/09/03 职场文书
餐饮店长岗位职责
2015/04/14 职场文书
工作失职自我检讨书
2015/05/05 职场文书
公司职员入党自传书
2015/06/26 职场文书
大学宣传委员竞选稿
2015/11/19 职场文书
2016八一建军节慰问信
2015/11/30 职场文书
优质服务标语口号
2015/12/26 职场文书
Apache Calcite 实现方言转换的代码
2021/04/24 Servers
Lombok的详细使用及优缺点总结
2021/07/15 Java/Android
利用 JavaScript 构建命令行应用
2021/11/17 Javascript