如何用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 相关文章推荐
Jquery中增加参数与Json转换代码
Nov 20 Javascript
script不刷新页面的联动前后代码
Sep 18 Javascript
js实现可得到不同颜色值的颜色选择器实例
Feb 28 Javascript
JavaScript学习笔记之检测客户端类型是(引擎、浏览器、平台、操作系统、移动设备)
Dec 03 Javascript
Zero Clipboard实现浏览器复制到剪贴板的方法(多个复制按钮)
Mar 24 Javascript
微信小程序 火车票查询实例讲解
Oct 17 Javascript
原生javascript实现图片放大镜效果
Jan 18 Javascript
详解Angular.js指令中scope类型的几种特殊情况
Feb 21 Javascript
基于jquery实现多选下拉列表
Aug 02 jQuery
bootstrap模态框关闭后清除模态框的数据方法
Aug 10 Javascript
Koa代理Http请求的示例代码
Oct 10 Javascript
Vue实现PC端靠边悬浮球的代码
May 09 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
php5.3 不支持 session_register() 此函数已启用的解决方法
2013/11/12 PHP
curl实现站外采集的方法和技巧
2014/01/31 PHP
php使用glob函数快速查询指定目录文件的方法
2014/11/15 PHP
jquery获取radio值实例
2014/10/16 Javascript
AngularJS入门教程(一):静态模板
2014/12/06 Javascript
jQuery中slideUp()方法用法分析
2014/12/24 Javascript
Jquery 实现checkbox全选方法
2015/01/28 Javascript
Jquery $when done then的用法详解
2016/05/20 Javascript
nodejs redis 发布订阅机制封装实现方法及实例代码
2016/12/15 NodeJs
js放大镜放大购物图片效果
2017/01/18 Javascript
jsTree事件和交互以及插件plugins详解
2017/08/29 Javascript
vue ajax 拦截原理与实现方法示例
2019/11/29 Javascript
JavaScript基于用户照片姓名生成海报
2020/05/29 Javascript
uniapp 仿微信的右边下拉选择弹出框的实现代码
2020/07/12 Javascript
解决vue单页面应用进入页面加载所有 js 的问题
2020/08/12 Javascript
如何利用vue实现波谱拟合详解
2020/11/05 Javascript
vue+vant 上传图片需要注意的地方
2021/01/03 Vue.js
python中类的一些方法分析
2014/09/25 Python
Python文档生成工具pydoc使用介绍
2015/06/02 Python
python+selenium开发环境搭建图文教程
2017/08/11 Python
Tensorflow实现卷积神经网络用于人脸关键点识别
2018/03/05 Python
Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
2018/04/17 Python
Django框架 querySet功能解析
2019/09/04 Python
Python scrapy增量爬取实例及实现过程解析
2019/12/24 Python
基于SpringBoot构造器注入循环依赖及解决方式
2020/04/26 Python
Python根据URL地址下载文件并保存至对应目录的实现
2020/11/15 Python
html5使用canvas实现图片下载功能的示例代码
2017/08/26 HTML / CSS
建筑施工员岗位职责
2013/11/26 职场文书
音乐教学案例
2014/01/30 职场文书
销售内勤岗位职责
2014/04/15 职场文书
处级干部反四风个人对照检查材料思想汇报
2014/09/27 职场文书
中学生旷课检讨书500字
2014/10/29 职场文书
三方合作意向书范本
2015/05/09 职场文书
2015年医务科工作总结范文
2015/05/26 职场文书
《合作意向书》怎么写?
2019/08/20 职场文书
解决Vue+SpringBoot+Shiro跨域问题
2021/06/09 Vue.js