作者:余韵之

webpack目前是前端常用的工程化工具了。它可以帮助我们自动化构建打包各类的资源,极大的提高了我们打包代码的效率。在webpack看来,所有的资源文件都是模块(module),只是处理的方式不同。

一、初探webpack

1、安装webpack

建议不要全局安装webpack,因为不同的项目webpack的版本号是不一样的。这样多个项目来回切换是很不方便的。npm install wepack webpack-cli -g

在项目内安装webpacknpm install wepack webpack-cli -D

注意:webpack-cli的作用是我们可以在命令行里直接使用webpack

检查版本npx webpack -v

查看 webpack 所有可以安装的版本号npm info webpack

2、最简单的webpack.config.js的配置const path = require('path');

module.exports = {

entry: {

main:'./src/index.js'

},

output: {

filename: 'main.js',

path: path.resolve(__dirname, 'dist')

}

}

这段配置是告诉我们:我们需要打包入口文件是./src/index.js,

最后输出的打包文件是在当前目录下dist/main.js

假如存在bundle/index.html,就可以通过script引入main.js文件了。当然这个也可以通过webpack自动化构建。

3、两种打包方式

1) npxnpx webpack

npx 表示会在当前目录里寻找依赖变量 webpack

2) script

在package.json里配置"scripts": {

"bundle": "webpack"

},

于是可以运行npm run bundle

运行 npx webpack / npm run bundle 会先检查是否有配置文件webpack.config.js,如果没有就走默认配置,如果有就走配置文件

4、打包的参数详解

Hash:表示这一次打包的唯一标识值

Version:表示这一次打包的使用版本

Time:表示当前打包整体耗时

Asset:表示此次打包出现了bundle.js

Size:表示该文件的大小

Chunk Names 表示的是 entry里入口的key,默认为main,也可以任意改为 xxx,yyy

Entrypoint main = bundle.js 表示入口文件 以及依次打包的文件0[2]……

二、使用Loader打包资源

1、什么是loader?

webpack不能识别非js的模块,需要对于不同的模块提供不同的打包方案,于是要求助于loader。如:css-loader、sass-loader、file-loader、vue-loader、postcss-loader等等

2、打包图片

file-loader实现原理思路: 当发现代码引入图片模块,首先把图片移动到dist目录下并改了名字,得到了相对于dist的地址,作为返回值给到我们引入的变量之中module.exports = {

entry: {

main: './src/index.js'

},

module: {

rules: [{

test: /\.(jpg|png)$/,

use: {

loader: 'file-loader',

options: {

name: '[name]_[hash].[ext]', // [name] [hash] [ext] 均为占位符

outputPath: 'images/', // 打包出的结果放在images/目录下

limit: 10240

}

}

}]

},

output: {

filename: 'main.js',

path: path.resolve(__dirname, 'dist')

}

}

3、打包CSS 或 SASScss-loader:会帮我们分析几个css的关系(互相引入)合并成一个css

style-loader:当css-loader合并成了一个css,style-loader会把内容挂载到head部分

sass-loader:解析sass成css

postcss-loader:自动添加-webkit等前缀,兼容不同浏览器样式

使用了postcss-loader,需要在根目录创建postcss.config.jsmodule.exports = {

plugins: [

require('autoprefixer')

]

}

webpack.config.js中module配置module: {

rules: [

{

test: /\.(jpg|png|gif)$/,

use: {

loader: 'url-loader',

options: {

name: '[name]_[hash].[ext]',

outputPath: 'images/',

limit: 10240

}

}

},

{

test: /\.(eot|ttf|svg)$/,

use: {

loader: 'file-loader'

}

},

{

test: /\.scss$/,

use: [

'style-loader',

{

loader: 'css-loader',

options: {

importLoaders: 2

}

},

'sass-loader',

'postcss-loader'

]

}]

},

Loader解析是有先后顺序的:从下到上,从右到左

4、CSS modules{

test: /\.scss$/,

use: [

'style-loader',

{

loader: 'css-loader',

options:{

importLoaders: 2,// 表示scss文件导入了scss文件依然走postcss-loader sass-loader

modules:true // 开启css模块化

}

},

'sass-loader',

'postcss-loader'

]

}

modules开启为true后,就可以使用模块化CSS互不干扰。否则引入的CSS或者SASS的代码会造成全局污染

使用方式如下import style from './index.scss’;

var img = new Image();

img.src = avatar;

img.classList.add(style.avatar);

5、打包字体

在webpack.config.js配置{

test: /\.(eot|ttf|svg)$/,

use: {

loader: 'file-loader'

}

},

三、使用Plugins打包便捷

1、什么是Plugins?

plugins是在某个时刻(刚打包、打包结束,打包中间)做一件事

2、html-webpack-plugin

在打包结束时,在dist自动生成html,并且把打包的main.js自动引入html的script的标签

3、clean-webpack-plugin

在每次打包生成的dist文件前,先删除里面的内容

4、安装及配置两个pluginnpm install html-webpack-plugin clean-webpack-plugin -D

webpack.config.jsconst HtmlWebpackPlugin = require('html-webpack-plugin');

const CleanWebpackPlugin = require('clean-webpack-plugin’);

plugins: [new HtmlWebpackPlugin({

template: 'src/index.html' // 参考模板为 src/index.html

}), new CleanWebpackPlugin(['dist'])],

还有其他的plugins,比如热更新 HotModuleReplacementPlugin ……

后面慢慢加上和介绍

四、Entry 和 Output 配置

前面的都是单入口,单出口的配置。

1、多入口,多出口entry: {

main: './src/index.js’,

sub: ‘./src/index.js'

},

plugins: [new HtmlWebpackPlugin({

template: 'src/index.html'

}), new CleanWebpackPlugin(['dist'])

],

output: {

filename: '[name].js',

path: path.resolve(__dirname, 'dist')

}

最后的结果是html 里会引入两个js文件

2、把打包的JS上传到CDNentry: {

main: './src/index.js’,

sub: ‘./src/index.js'

},

plugins: [new HtmlWebpackPlugin({

template: 'src/index.html'

}), new CleanWebpackPlugin(['dist'])

],

output: {

publicPath: 'http://cdn.com.cn', // 最后打包出来是http://cdn.com.cn、main.js

filename: '[name].js',

path: path.resolve(__dirname, 'dist')

}

html引入的script 会自动加上publicPath路径

五、SourceMap

1、什么是SourceMap

先举个例子:

打开浏览器发现代码报错了。。。。现在知道dist目录下main.js 文件 96行出错。

用了sourceMap之后(它是一个映射关系),于是知道dist目录下main.js文件96行实际上对应的是src目录下index.js文件中的第1行

使用了sourceMap 打包速度是会变慢的。同时dist里多了一个xx.js.map文件,原理一个vlq集合

2、配置SourceMap

在webpack.config.js 里 devtooldevtool: 'cheap-module-eval-source-map',

常用的几个source-map的前缀:Inline:inline-source-map 是把xx.js.map内容直接打包到xx.js里,用data url形式的方式放在末尾,会告诉你第几行第几列除了问题,很耗费性能

Cheap:添加cheap-inline-source-map 可以精确到每一行不精确到每一列出错 ,可以降低打包时间,提高性能

Module:如果要管第三方模块代码的映射可以加上module,可以加上cheap-module-inline-source-map

Eval:eval是打包最快的方式 ,通过eval是执行效率最快、性能最好的方式,但是如果代码复杂的话,提示的内容可能不够全面,用eval的方式执行JS代码

3、最佳实践

开发环境:提示全,打包速度快mode: 'development',

devtool: 'cheap-module-eval-source-map',

生产环境:提示效果会更好mode: 'production',

devtool: 'cheap-module-source-map',

六、webpackDevServer

1、如何解决每次手动打包,手动启动浏览器刷新页面更新代码?webpack —watch

在package.json 里 script 添加"watch": "webpack --watch"

优点:监听到源代码改变,会自动打包

缺点:需要手动刷新页面webpack-dev-server

在package.json 里 script 添加"start": "webpack-dev-server",

在devDependencies安装"webpack-dev-server": "^3.1.10"

优点:监听到源代码改变,会自动打包,自动启动服务器,自动更新浏览器

注意使用了webpack-dev-server打包后就不会目录里有dist了,而是放在电脑某个内存里,可以提高效率。

2、如何启动时自动打开浏览器

在webpack.config.js配置devServer: {

contentBase: './dist',

open: true, // 默认启动开启浏览器

port: 8080, // 端口设置为8080

},

七、热更新 HMR(HOT MODULE REPLACE)

如果只是纯粹使用了webpack-dev-server那么当改变了代码,浏览器会自动刷新初始化数据。有时候比较麻烦。

有没有什么办法可以做到:

当修改了css只改变css的样式,js新增的数据不变。

此时把背景色改成红色

或者当修改了某一个模块的数据,另一个模块的数据不改变

配置如下

webpack.config.jsconst webpack = require('webpack’);

devServer: {

contentBase: './dist',

open: true,

port: 8080,

hot: true, // 开启热更新的功能

hotOnly: true // 即使HMR不生效,也不更新浏览器

},

plugins: [

new HtmlWebpackPlugin({

template: 'src/index.html'

}),

new CleanWebpackPlugin(['dist']),

new webpack.HotModuleReplacementPlugin() // 配置热更新plugins

],

同时必须添加模块更新的代码。例如有两个模块,当改变了number模块,就更新number,counter模块不改变

index.jsimport counter from './counter';

import number from './number';

counter();

number();

if(module.hot) {

module.hot.accept('./number', () => {

document.body.removeChild(document.getElementById('number'));

number();

})

}

css可以不写 module.hot判断 是因为css-loader已经实现了。如果一些特别的模块,就需要自己写一个module.hot来判断

八、Babel处理ES6语法

1、安装依赖npm install —save-dev babel-loader @babel/core @babel/preset-envbabel-loader : 提供识别模块的打包工具

@babel/core : 识别js代码转化为AST抽象语法树,编译转化成新的语法

@babel/preset-env : 把ES6代码转化为ES5语法,提供了翻译规则

2、打包方式

二选一

1)安装@babel/profillnpm install -save-dev @babel/profill

缺点:这个会出现全局污染

配置规则rules:[{

test: /\.js$/,

exclude: /node_modules/,

loader: 'babel-loader',

options:{

presets: [['@babel/preset-env', {

targets: {

chrome: "67",

},

useBuiltIns: 'usage' // 表示做polyfill 根据业务代码来加对应的代码,可以减少打包的体积

}]]

}

}],

注意:useBuiltIns: 'usage' 表示按需引入

2)安装 @babel/plugin-transform-runtimenpm install -save-dev @babel/plugin-transform-runtime @babel/runtime @babel/runtime-corejs2

优点:可是使用闭包的方式不影响其他环境变量

配置 创建.babelrc{

"plugins": [["@babel/plugin-transform-runtime", {

"corejs": 2, // 使用了2 就需要安装 @babel/runtime-corejs2

"helpers": true,

"regenerator": true,

"useESModules": false

}]]

}

webpack.config.js{

test: /\.js$/,

exclude: /node_modules/,

loader: 'babel-loader'

}

九、打包React代码

1、安装依赖

@babel/preset-react : 可以解析JSXnpm install --save-dev @babel/preset-react

webpack.config.js{

test: /\.js$/,

exclude: /node_modules/,

loader: 'babel-loader',

}

创建.babelrc{

"presets": [

[

"@babel/preset-env", {

"targets": {

"chrome": "67"

},

"useBuiltIns": "usage"

}

],

"@babel/preset-react"

]

}

注意:先解析react的语法,然后再把ES6语法解析为ES5。presets是自下而上,自右边而左来解析的

python如何导入numpy简书_Webpack 之常用配置(一)相关推荐

  1. python如何导入numpy简书_如何使用python3.x成功导入numpy?

    现在,来讨论这个问题.我成功地安装了numpy 1.7.0,虽然我必须先做一些注册表版本,但是在尝试将其导入shell时,我遇到了大量错误:Traceback (most recent call la ...

  2. Python爬虫教程:简书文章的抓取与存储

    本文内容将与大家一起从简书的文章页面抓取文章标题.作者.发布时间以及正文内容,并且将抓取到的这些信息存入Excel表格中.本文对简书文章的抓取仅为Python的学习交流,尊重作者著作权,不对抓取到的文 ...

  3. python对excel操作简书_Python实现EXCEL常用操作——pandas简介

    知乎的代码块太丑了,这里的内容就更新到简书了Python实现EXCEL常用操作--pandas简介​www.jianshu.com EXCEL是日常办公最常用的软件,然而遇到数据量特别大(超过10W条 ...

  4. python爬虫(以简书为例)

    1.主题: 简单爬取简书中的专题''@IT·互联网"中的文章,爬取信息之后通过jieba分词生成词云并且进行分析: 2.实现过程:    第一步:打开简书并进入到@IT-互联网专题 网页链接 ...

  5. python中导入numpy库_python中的Numpy库

    导入numpy库: import numpy as np python的一个科学计算库的一个基础包,包含了强大的N维数组对象和向量运算 数组创建,可以使用array函数从常规的python列表和或元组 ...

  6. python爬虫——爬取简书文章

    这段时间在做的事情需要从网上获得一点资讯类似文章啊.电影啊.新闻啊等等,看了很久感觉用简书这个网址来做爬虫相对来说简单一点,可以不需要设置登录啥的就能够获取到内容,相比较起来已经很容易了. (一)分析 ...

  7. python中导入numpy为什么错误_导入numpy而不安装

    有numpy没有安装就可以导入的方法吗? 我在.exePyInstaller中内置了一个通用应用程序.该应用程序具有一个插件系统,可通过Python脚本对其进行扩展.插件导入系统适用于基本模块(单个. ...

  8. python基础知识笔记简书_Python基础学习笔记

    Python貌似有点火热,上手还是比较简单的,自己找了个教程也偷偷的学习一下,扒了一下网上的图片和数据,感觉并不是很难呀(不过之前换电脑,代码丢了,有点可惜,不过网上教程一抓一大把,随便看看也能扒一些 ...

  9. python基础知识笔记简书_Python学习笔记01——基础知识

    Python常用数据类型: 整数(int),浮点数(float),字符串(str) 布尔型(True,False),空值(None) 列表(list):一种有序集合,可以随时添加删除其中的元素. cl ...

最新文章

  1. 1067. 试密码(20)
  2. 【漏洞实战】某网站JS文件泄露导致拿到服务器权限
  3. Python3 图片(jpg、bmp、png)转PDF
  4. 找中位数,找第k小,还存在问题
  5. Android中利用productFlavors配置多渠道
  6. Html.RadioButtonFor和Html.DropDownListFor 用法--备忘
  7. boost::bind with ros action,ros中SimpleActionServer用boost::bind绑定多个参数
  8. Sismics Reader: Google Reader的一个本地替代品
  9. java 请求 https_JAVA后端请求HTTPS 的URL 遇到的问题
  10. 梦想是如何失去的?看小米和魅族发布有感
  11. ningx访问日志切割
  12. kettle作业定时如何在开源调度工具taskctl里实现
  13. 从零开始学51单片机
  14. 离散数学学习笔记 第二章 命题逻辑
  15. matlab开始如何设置,MATLAB 2018B: 如何创建快捷方式
  16. 特拉华大学计算机科学,特拉华大学计算机科学理学硕士研究生申请要求及申请材料要求清单...
  17. 华文慕课计算机组成结构第二章课后习题解析
  18. scrapy_redis种子优化
  19. java实现utf-8与GB2312编码的转换
  20. 深度推荐模型 -NFM

热门文章

  1. NBU调用crontab备份
  2. sqlserver导入execl数据ACE.OLEDB.12.0错误
  3. 20165237 2017-2018-2 《Java程序设计》第1周学习总结
  4. C++ Templates之模板元编程
  5. Oracle对表的基本操作
  6. NeurIPS 2021 | 图像损坏场景下行人重识别新基准
  7. 谷歌官方推出 TensorFlow 中文视频:机器学习从零到一
  8. Mapillary发布世界最大交通标志数据集,用于自动驾驶研究
  9. ICCV 2019 | ActivityNet 挑战赛冠军方案—时序动作提名,边界匹配网络详解
  10. 腾讯内容平台部-视频内容理解算法实习生