详解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 相关文章推荐
javascript 遍历验证所有文本框的值
Aug 27 Javascript
用jQuery技术实现Tab页界面之二
Sep 21 Javascript
JS 页面计时器示例代码
Oct 28 Javascript
JavaScript字符串对象substr方法入门实例(用于截取字符串)
Oct 16 Javascript
招聘网站基于jQuery实现自动刷新简历
May 10 Javascript
jQuery实现的导航动画效果(附demo源码)
Apr 01 Javascript
微信小程序 教程之小程序配置
Oct 17 Javascript
vue项目中axios使用详解
Feb 07 Javascript
Koa2微信公众号开发之本地开发调试环境搭建
May 16 Javascript
angularjs手动识别字符串中的换行符方法
Oct 02 Javascript
typescript编写微信小程序创建项目的方法
Jan 29 Javascript
详解Vue3.0 + TypeScript + Vite初体验
Feb 22 Vue.js
详解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
dedecms中常见问题修改方法总结
2007/03/21 PHP
PHP使用feof()函数读文件的方法
2014/11/07 PHP
PHPstorm快捷键(分享)
2017/07/17 PHP
javascript 写类方式之八
2009/07/05 Javascript
如何让浏览器支持jquery ajax load 前进、后退功能
2014/06/12 Javascript
jQuery中ScrollTo用法示例
2016/09/04 Javascript
JS获取html元素的标记名实现方法
2016/10/08 Javascript
BootStrap Datepicker 插件修改为默认中文的实现方法
2017/02/10 Javascript
ES6学习之变量的两种命名方法示例
2017/07/18 Javascript
React如何将组件渲染到指定DOM节点详解
2017/09/08 Javascript
vue中element-ui表格缩略图悬浮放大功能的实例代码
2018/06/26 Javascript
微信小程序自定义菜单切换栏tabbar组件代码实例
2019/12/30 Javascript
基于ajax实现上传图片代码示例解析
2020/12/03 Javascript
python使用多线程不断刷新网页的方法
2015/03/31 Python
Djang中静态文件配置方法
2015/07/30 Python
python 全文检索引擎详解
2017/04/25 Python
python生成词云的实现方法(推荐)
2017/06/13 Python
Python模拟浏览器上传文件脚本的方法(Multipart/form-data格式)
2018/10/22 Python
python 实现turtle画图并导出图片格式的文件
2019/12/07 Python
python自动下载图片的方法示例
2020/03/25 Python
详解PyQt5中textBrowser显示print语句输出的简单方法
2020/08/07 Python
python计算auc的方法
2020/09/09 Python
python实现启动一个外部程序,并且不阻塞当前进程
2020/12/05 Python
一款纯css3实现的非常实用的鼠标悬停特效演示
2014/11/05 HTML / CSS
一款html5 canvas实现的图片玻璃碎片特效
2014/09/11 HTML / CSS
加拿大领先的时尚和体育零售商:Sporting Life
2019/12/15 全球购物
同学聚会欢迎辞
2014/01/14 职场文书
商场总经理岗位职责
2014/02/03 职场文书
个性发展自我评价
2014/02/11 职场文书
《一株紫丁香》教学反思
2014/02/19 职场文书
学校消防安全责任书
2014/07/23 职场文书
2014年小学语文工作总结
2014/12/20 职场文书
幼儿园小班个人总结
2015/02/12 职场文书
2016年感恩父亲节活动总结
2016/04/01 职场文书
MySql 8.0及对应驱动包匹配的注意点说明
2021/06/23 MySQL
B站评分公认最好看的动漫,你的名字评分9.9,第六备受喜欢
2022/03/18 日漫