详解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 相关文章推荐
用YUI做了个标签浏览效果
Feb 20 Javascript
JavaScript中OnLoad几种使用方法
Dec 15 Javascript
jquery配合css简单实现返回顶部效果
Sep 30 Javascript
表格奇偶行设置不同颜色的核心JS代码
Dec 24 Javascript
Bootstrap轮播插件使用代码
Oct 11 Javascript
JS实现倒计时(天数、时、分、秒)
Nov 16 Javascript
JS搜狐面试题分析
Dec 16 Javascript
JavaScript数据结构之数组的表示方法示例
Apr 12 Javascript
Node.js 回调函数实例详解
Jul 06 Javascript
解决vue多个路由共用一个页面的问题
Mar 12 Javascript
Vue递归实现树形菜单方法实例
Nov 06 Javascript
输入框跟随文字内容适配宽实现示例
Aug 14 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
获得Google PR值的PHP代码
2007/01/28 PHP
PHP 一个页面执行时间类代码
2010/03/05 PHP
PHP数据类型之布尔型的介绍
2013/04/28 PHP
隐性调用php程序的方法
2015/06/13 PHP
搜索附近的人PHP实现代码
2018/02/11 PHP
最简单的jQuery程序 入门者学习
2009/07/09 Javascript
基于JQuery的Pager分页器实现代码
2010/07/17 Javascript
javascript加号"+"的二义性说明
2013/03/04 Javascript
jquery中animate动画积累的解决方法
2013/10/05 Javascript
Jqgrid表格随窗口大小改变而改变的简单实例
2013/12/28 Javascript
用json方式实现在 js 中建立一个map
2014/05/02 Javascript
jquery删除数据记录时的弹出提示效果
2014/05/06 Javascript
node.js中的fs.realpathSync方法使用说明
2014/12/16 Javascript
JQuery控制div外点击隐藏而div内点击不会隐藏的方法
2015/01/13 Javascript
javascript实现获取字符串hash值
2015/05/10 Javascript
JavaScript编程中的Promise使用大全
2015/07/28 Javascript
jquery-mobile基础属性与用法详解
2016/11/23 Javascript
神级程序员JavaScript300行代码搞定汉字转拼音
2017/05/20 Javascript
微信小程序实现轮播图效果
2017/09/07 Javascript
微信小程序分享功能之按钮button 边框隐藏和点击隐藏
2018/06/14 Javascript
react的hooks的用法详解
2020/10/12 Javascript
[01:02:17]2014 DOTA2华西杯精英邀请赛 5 24 DK VS VG
2014/05/26 DOTA
[36:29]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs TNC
2018/04/02 DOTA
bat和python批量重命名文件的实现代码
2016/05/19 Python
python 返回列表中某个值的索引方法
2018/11/07 Python
windows安装TensorFlow和Keras遇到的问题及其解决方法
2019/07/10 Python
python常见字符串处理函数与用法汇总
2019/10/30 Python
详解从Django Allauth中进行登录改造小结
2019/12/18 Python
python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)
2020/03/09 Python
N:Philanthropy官网:美国洛杉矶基础款服装
2020/06/09 全球购物
营销与策划应届生求职信
2013/11/04 职场文书
电子技术专业中专生的自我评价
2013/12/17 职场文书
道路施工安全责任书
2014/07/24 职场文书
模范班主任事迹材料
2014/12/17 职场文书
银行文明优质服务培训心得体会
2016/01/09 职场文书
《圆的面积》教学反思
2016/02/19 职场文书