详解webpack4.x之搭建前端开发环境


Posted in Javascript onMarch 28, 2019

webpack是一个现代JavaScript应用程序的静态模块打包器,借用官网的一张图,它能够将一些预处理语言,js的最新语法转换成浏览器识别的内容。现在一般的前端框架都有比较成熟的脚手架,大多数对webpack都有个较好的集成,我们只需要敲一些简单的命令就能生成一个通用的项目模板,比较便捷,但是要知其然知其所以然,所以今天就尝试着从零开始搭建一个前端开发环境。

详解webpack4.x之搭建前端开发环境

项目源码:

https://github.com/gerryli0214/webpack-demo

webpack的四个核心概念:

1.、入口(entry)

2、输出(output)

3、loader

4、插件(plugins)

首先,我们执行下npm init;初始化一个node工程,填写项目的信息,整个项目的目录结构如下:

详解webpack4.x之搭建前端开发环境

全部安装webpack-cli:

npm install webpack-cli -g

新建一个 webpack.config.js, 这个是webpack默认配置文件,在里面我们可以配置打包信息,初始化文件为:

const config = {};
module.exports = config;

入口(entry):

项目的入口文件,可以配置单个/多个,为入口文件的相对路径,type: string/object; 我们项目入口文件为index.js。

const config = {
  entry: './src/index.js'
}

module.exports = config;

输出(output):

打包后的文件路径和配置信息,path为打包文件路径,filename为输出文件名称,name为原始文件名称,hash为打包后的hash地址:

output: {
  path: path.resolve(__dirname, 'dist'),
  filename: '[name].[hash].min.js'
}

loader:

loader能够处理非JavaScript文件,webpack默认只能处理JavaScript文件。在使用loader时,首先要安装下指定loader的依赖,此部分的配置规则与之前版本有所差异,具体配置如下:

npm install babel-loader css-loader -D
module: {
    rules: [{
        test: /\.css$/,
        use: ExtractTextPlugin.extract({
          fallback: 'style-loader',
          use: 'css-loader'
        })
      },
      {
        test: /\.js/,
        exclude: /node_modules/, //过滤node_modules文件夹
        use: [{
          loader: 'babel-loader'
        }]
      }
    ]
  }

插件(plugins):

插件是webpack最为强大的功能之一,利用插件,我们可以进行代码的混淆、压缩、重新定义项目环境变量等。插件分为webpack内置插件和第三方插件,第三方插件在使用时首先要安装依赖和导入依赖模块。详细的使用方法可以参考npm。下面罗列了几个项目中常用的插件:

html-webpack-plugin:

主要作用:

1、为html文件中引入的外部资源如 scriptlink 动态添加每次compile后的hash,防止引用缓存的外部文件问题

2、可以生成创建html入口文件,比如单页面可以生成一个html文件入口,配置多个就可以打包成多页面

extract-text-webpack-plugin:

主要作用:分离打包的css文件

uglifyjs-webpack-plugin:

主要作用:混淆js代码

webpack-bundle-analyzer:

主要作用:生成打包文件报告,可以看到各个模块打包后文件大小信息

clean-webpack-plugin:

主要作用:每次打包之前清除dist文件夹

配置信息如下:

const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
const CleanWebpackPlugin = require('clean-webpack-plugin');

const config = {
  entry: './src/index.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].[hash].min.js'
  },
  module: {
    rules: [{
        test: /\.css$/,
        use: ExtractTextPlugin.extract({
          fallback: 'style-loader',
          use: 'css-loader'
        })
      },
      {
        test: /\.js/,
        exclude: /node_modules/, //过滤node_modules文件夹
        use: [{
          loader: 'babel-loader'
        }]
      }
    ]
  },
  optimization: {
    splitChunks: {
      name: "vendor",
      filename: 'vendor-[hash].min.js'
    },
    minimizer: [new UglifyJsPlugin()]
  },
  plugins: [
    new HtmlWebpackPlugin({ template: './src/index.html' }),
    new ExtractTextPlugin({
      filename: 'build.min.css',
      allChunks: true,
    }),
    new webpack.BannerPlugin({
      banner: `构建时间:${new Date().getFullYear()}-${new Date().getMonth()+1}-${new Date().getDate()}`
    }),
    new CleanWebpackPlugin(),
    // new webpack.EnvironmentPlugin({ NODE_ENV: 'production' }),
    new BundleAnalyzerPlugin()
  ]
};

module.exports = config;

以上为打包的基础配置信息,在我们实际开发中,经常会用到前端开发服务,模块热更新以及前端的跨域请求代理,webpack中提供了webpack-dev-server来满足我们的需求,在使用之前先安装下webpack-dev-server的依赖:

npm install webpack-dev-server -D

具体文件配置如下:

devServer: {
    contentBase: path.join(__dirname, 'dist'),
    compress: true,
    host: '0.0.0.0',
    port: 9000,
    hot: true, //是否热更新
    proxy: { //代理
      '/api': 'http://localhost:3000'
    }
  }

package.json中启动命令配置如下:

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "webpack-dev-server --mode development",
    "build": "webpack --mode production"
  }

执行npm run start,执行结果如下:

详解webpack4.x之搭建前端开发环境

这样开发环境我们的主要配置就完成了,但是当我们用uglifyjs压缩es6代码时,会发现会报错,因为uglifyjs不能压缩es6的代码,此时我们需要手动配置下babel,具体步骤如下:

1、安装项目依赖

npm install @babel/core @babel/preset-env -D

2、新建在项目根目录下 .babelrc 文件,填入以下配置信息

{
  "presets":["@babel/preset-env"]
}

执行npm run build,压缩项目代码,结果如下:

详解webpack4.x之搭建前端开发环境

全部代码:

const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
const CleanWebpackPlugin = require('clean-webpack-plugin');

const config = {
  entry: './src/index.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].[hash].min.js'
  },
  module: {
    rules: [{
        test: /\.css$/,
        use: ExtractTextPlugin.extract({
          fallback: 'style-loader',
          use: 'css-loader'
        })
      },
      {
        test: /\.js/,
        exclude: /node_modules/, //过滤node_modules文件夹
        use: [{
          loader: 'babel-loader'
        }]
      }
    ]
  },
  optimization: {
    splitChunks: {
      name: "vendor",
      filename: 'vendor-[hash].min.js'
    },
    minimizer: [new UglifyJsPlugin()]
  },
  plugins: [
    new HtmlWebpackPlugin({ template: './src/index.html' }),
    new ExtractTextPlugin({
      filename: 'build.min.css',
      allChunks: true,
    }),
    new webpack.BannerPlugin({
      banner: `构建时间:${new Date().getFullYear()}-${new Date().getMonth()+1}-${new Date().getDate()}`
    }),
    new CleanWebpackPlugin(),
    // new webpack.EnvironmentPlugin({ NODE_ENV: 'production' }),
    new BundleAnalyzerPlugin()
  ],
  devServer: {
    contentBase: path.join(__dirname, 'dist'),
    compress: true,
    host: '0.0.0.0',
    port: 9000,
    hot: true, //是否热更新
    proxy: { //代理
      '/api': 'http://localhost:3000'
    }
  },
  devtool: 'source-map'
};

module.exports = config;

参考资料:

webpack中文网: https://www.webpackjs.com

webpack内置插件列表: https://www.webpackjs.com/plugins/

第三方插件可自行搜索npm: https://www.npmjs.com/

项目源码:https://github.com/gerryli0214/webpack-demo

文笔比较粗糙,如有问题,烦请指出,谢谢!以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
document 和 document.all 分别什么时候用
Jun 22 Javascript
JavaScript Event学习第七章 事件属性
Feb 07 Javascript
javascript算法题 求任意一个1-9位不重复的N位数在该组合中的大小排列序号
Jul 21 Javascript
div模拟选择框示例代码
Nov 03 Javascript
深入分析Cookie的安全性问题
Mar 01 Javascript
可输入文字查找ajax下拉框控件 ComBox的实现方法
Oct 25 Javascript
详解js运算符单竖杠“|”与“||”的用法和作用介绍
Nov 04 Javascript
angularjs实现下拉列表的选中事件示例
Mar 03 Javascript
vue.js移动数组位置,同时更新视图的方法
Mar 08 Javascript
vue-router中的hash和history两种模式的区别
Jul 17 Javascript
vue基础之v-bind属性、class和style用法分析
Mar 11 Javascript
vue webpack重写cookie路径的方法
Jul 10 Javascript
详解Vue.directive 自定义指令
Mar 27 #Javascript
vue 列表页跳转详情页获取id以及详情页通过id获取数据
Mar 27 #Javascript
js取0-9随机取4个数不重复的数字代码实例
Mar 27 #Javascript
vue 详情跳转至列表页实现列表页缓存
Mar 27 #Javascript
vue中多个倒计时实现代码实例
Mar 27 #Javascript
JavaScript偏函数与柯里化实例详解
Mar 27 #Javascript
vue实现鼠标移入移出事件代码实例
Mar 27 #Javascript
You might like
关于Appserv无法打开localhost问题的解决方法
2009/10/16 PHP
php 获取当前访问的url文件名的方法小结
2010/02/08 PHP
让的PHP代码飞起来的40条小技巧(提升php效率)
2010/04/12 PHP
php实现将任意进制数转换成10进制的方法
2015/04/17 PHP
PHP的垃圾回收机制代码实例讲解
2021/02/27 PHP
解决Extjs 4 Panel作为Window组件的子组件时出现双重边框问题
2013/01/11 Javascript
css transform 3D幻灯片特效实现步骤解读
2013/03/27 Javascript
无缝滚动js代码通俗易懂(自写)
2013/06/19 Javascript
jquery中ajax函数执行顺序问题之如何设置同步
2014/02/28 Javascript
JavaScript判断表单提交时哪个radio按钮被选中的方法
2015/03/21 Javascript
jquery实现的缩略图预览滑块实例
2015/06/25 Javascript
jQuery实现横向带缓冲的水平运动效果(附demo源码下载)
2016/01/29 Javascript
Javascript基础_简单比较undefined和null 值
2016/06/14 Javascript
AngularJS入门教程中SQL实例详解
2016/07/27 Javascript
JavaScript-定时器0~9抽奖系统详解(代码)
2017/08/16 Javascript
ES6中Array.copyWithin()函数的用法实例详解
2017/09/16 Javascript
chorme 浏览器记住密码后input黄色背景处理方法(两种)
2017/11/22 Javascript
Vue父组件调用子组件事件方法
2018/02/23 Javascript
Vue-cli项目获取本地json文件数据的实例
2018/03/07 Javascript
jQuery 导航自动跟随滚动的实现代码
2018/05/30 jQuery
基于three.js实现的3D粒子动效实例代码
2019/04/09 Javascript
vue实现多级菜单效果
2019/10/19 Javascript
非常漂亮的js烟花效果
2020/03/10 Javascript
[04:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster 选手采访
2021/03/11 DOTA
听歌识曲--用python实现一个音乐检索器的功能
2016/11/15 Python
Python实现按当前日期(年、月、日)创建多级目录的方法
2018/04/26 Python
Python实现处理逆波兰表达式示例
2018/07/30 Python
用Python实现将一张图片分成9宫格的示例
2019/07/05 Python
jupyter notebook tensorflow打印device信息实例
2020/04/20 Python
英国设计师泳装、沙滩装和比基尼在线精品店:Beach Cafe
2019/08/28 全球购物
介绍下Lucene建立索引的过程
2016/03/02 面试题
运动会广播稿200字
2014/10/18 职场文书
2016入党心得体会范文
2016/01/06 职场文书
经典哲理警句:志不真则心不热,心不热则功不贤
2019/11/14 职场文书
62句有关感恩节文案(推荐收藏)
2019/11/28 职场文书
CSS子盒子水平和垂直居中的五种方法
2022/07/23 HTML / CSS