如何用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 表单取值常用代码
Dec 22 Javascript
js常用代码段收集
Oct 28 Javascript
js自定义事件及事件交互原理概述(二)
Feb 01 Javascript
JavaScript中实现PHP的打乱数组函数shuffle实例
Oct 11 Javascript
JavaScript操作select元素和option的实例代码
Jan 29 Javascript
深入解析AngularJS框架中$scope的作用与生命周期
Mar 05 Javascript
详解JavaScript实现设计模式中的适配器模式的方法
May 18 Javascript
如何在js代码中消灭for循环实例详解
Jul 29 Javascript
Node.js原生api搭建web服务器的方法步骤
Feb 15 Javascript
微信小程序实现上传多个文件 超过10个
Mar 30 Javascript
基于JavaScript实现留言板功能
Mar 16 Javascript
vue抽出组件并传值实例
Jul 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实现手机归属地查询API接口实现代码
2012/08/27 PHP
简单实现限定phpmyadmin访问ip的方法
2013/03/05 PHP
php基于base64解码图片与加密图片还原实例
2014/11/03 PHP
thinkPHP简单导入和使用阿里云OSSsdk的方法
2017/03/15 PHP
js获取div高度的代码
2008/08/09 Javascript
asp.net HttpHandler实现图片防盗链
2009/11/09 Javascript
关于this和self的使用说明
2010/08/01 Javascript
javascript窗口宽高,鼠标位置,滚动高度(详细解析)
2013/11/18 Javascript
JavaScript AOP编程实例
2015/06/16 Javascript
简单的分页代码js实现
2016/05/17 Javascript
ES6入门教程之Class和Module详解
2017/05/17 Javascript
浅谈通过JS拦截 pushState和replaceState事件
2017/07/21 Javascript
react-router v4如何使用history控制路由跳转详解
2018/01/09 Javascript
微信小程序实现手指触摸画板
2018/07/09 Javascript
webpack3.0升级4.0的方法步骤
2020/04/02 Javascript
JS内置对象和Math对象知识点详解
2020/04/03 Javascript
vue2.* element tabs tab-pane 动态加载组件操作
2020/07/19 Javascript
Python入门篇之正则表达式
2014/10/20 Python
python学习之编写查询ip程序
2016/02/27 Python
python解决网站的反爬虫策略总结
2016/10/26 Python
ubuntu环境下python虚拟环境的安装过程
2018/01/07 Python
浅谈python中requests模块导入的问题
2018/05/18 Python
解决新django中的path不能使用正则表达式的问题
2018/12/18 Python
python自动化UI工具发送QQ消息的实例
2019/08/27 Python
TensorFlow内存管理bfc算法实例
2020/02/03 Python
html5 touch事件实现触屏页面上下滑动(二)
2016/03/10 HTML / CSS
托管代码(Managed Code)和非托管代码(Unmanaged Code)有什么区别
2014/09/29 面试题
简单的JAVA编程面试题
2013/03/19 面试题
公务员转正鉴定材料
2014/02/11 职场文书
高三学生评语大全
2014/04/25 职场文书
餐厅筹备计划书
2014/04/25 职场文书
社区矫正工作方案
2014/06/04 职场文书
家庭经济困难证明
2015/06/23 职场文书
自信主题班会
2015/08/14 职场文书
《最后一头战象》读后感:动物也有感情
2020/01/02 职场文书
Python实现制作销售数据可视化看板详解
2021/11/27 Python