webpack是模块化打包工具,通过webpack,可以使得我们更加方便地组织代码、压缩、转译等等。 但是学习webpack也需要一定的成本,这里记录使用webpack许久以来一些模糊的知识点,方便以后查阅。

  https://webpack.js.org/configuration/ (该配置文件可以帮助我们快速理解实际项目中的配置属性)

1. var path = require('path'),其中的path需要我们安装吗?

  不需要。 使用了node环境之后,path模块是node提供了的,所以不需要进行npm install path这样的操作。

2. webpack的好处有哪些 ?

  开头就说了,使用webpack可以方便我们组织代码,比如一个项目依赖于某个库,我们可以直接将这个库的js放在html中,然后再在另一处引入js文件,这个js使用了这个库,但是他们却没有明显的依赖关系,并且在项目稍大时,不仅依赖关系很难控制,并且会引入很多文件,发送多个http请求。 但是使用了webpack之后,我们就可以从一个入口文件开始组织依赖关系,这样的关系就很明确,并且最终可以打包到一个js中,减少了http请求。

3. 必须在根目录下添加一个webpack.config.js文件吗? 名字不能改变? 位置不能改变? 既然可以使用CLI,为什么还要使用配置文件呢?

  不是的。 一般,在根目录下回有一个webpack.config.js,然后在CLI工具中使用weibpack命令就可以就可以默认找到根目录下的webpack.config.js进行打包,而我们也可以起一个别的配置文件的名字,如my.config.js,只是这时我们需要指定相应的参数,如 webpack --config my.config.js ,只是这时还是默认根目录。 好处在于这种方法对于大型项目,配置文件可能不只一个,我们需要自定义名称。

  虽然可以使用CLI完成相同的命令,但是每次你都需要输入一大段命令。 而如果使用了配置文件, 就只需要webpack, 更多设置就由配置文件来提示了。

  当然,另外一种更为方便和广泛使用的方法就是使用npm scripts,如npm run build,在package.json中的scripts中使用"build": "webpack"即可。

4. 在做项目时,我们发现在配置webpack的过程中,想要在jsx文件中引入图片或者是css都不能成功,这是为什么?

  因为webpack认为这个项目中的所有文件都是模块,都是他所关心的。 遗憾的是,webpack只认识js文件, 对于js的处理没有问题,但是对于css文件、图片、设置js衍生出的jsx文件都是不能识别的,如果希望正常引用这些文件,我们必须要使用webpack四大核心概念(entry、output、plugins、loaders)中的loaders,即模块加载器,比如对于一般的react项目,我们需要保证的是jsx、css、less以及图片的正常加载,配置文件如下所示:

module.exports = {entry: ["./src/index.js"],output: {path: __dirname + "/dist",filename: "bundle.js"},watch: true,module: {loaders: [{test: /\.jsx?$/,loader: 'babel-loader',exclude: /node_modules/,query: {presets: ['es2015', 'react']}},{test: /\.css$/,loader: 'style-loader!css-loader'},{test: /\.less$/,use: [{loader: "style-loader" // creates style nodes from JS strings
             }, {loader: "css-loader" // translates CSS into CommonJS
             }, {loader: "less-loader" // compiles Less to CSS
             }]},{test: /\.(jpg|png|svg)$/,loader: 'url-loader'}]}
}

即test属性用于检测文件类型,而loader属性用于说明使用的加载器。

babel-loader用于加载jsx文件,css-loader用于寻找所有的css文件、style-loader用于嵌入css文件到html中,style-loader、css-loader、less-loader三者配合处理less文件,对于图片文件也需要url-loader加载器才能完成模块的加载。

  

5. 第四个问题中,我们提到了loaders的作用,但是在官网上可以发现loaders内容下的例子使用的却是rules,那么loaders和rules的区别是什么呢? 

  在stackoverflow上,我们可以发现这个问题:https://stackoverflow.com/questions/43002099/rules-vs-loaders-in-webpack-whats-the-difference ,即loaders的使用大多在webpack1,而rules是用在webpack2中的,并且 loaders 在未来将会被废弃。

  官网上的介绍如下:

const path = require('path');const config = {entry: './path/to/my/entry/file.js',output: {path: path.resolve(__dirname, 'dist'),filename: 'my-first-webpack.bundle.js'},module: {rules: [{ test: /\.txt$/, use: 'raw-loader' }]}
};module.exports = config;

但是在使用这种方法时对于jsx的query、exclude会出现一些问题,目前尚未解决。 因为使用webpack2和1有所不同,需要在stackoverflow进一步寻找答案。

6. loaders和plugins的区别是什么? 实例?

  loaders的作用大多是为了解决单个文件的,将之转化为模块,但是plugins是一个更为强大、有力的针对打包的文件进行编译等的工具,loaders的使用一般都是直接针对不同的文件使用不同的loader,但是plugins的使用是先通过require引入,然后在plugins中使用new创建实例才能完成的。

7. 为什么有时候觉得引用的相对路径没有问题,但是在控制台中看到的是404 not found? 在webpack配置文件中output里的path和publicPath的区别是什么(node端如此)

  https://webpack.js.org/configuration/output/#output-publicpath

  一般path都会结合内置的path模块来使用,而publicPath不是的。path是说最终打包到的位置,而publicPath的作用是引用外部资源的位置。两者是完全不同的。 其默认是“”。 比如在我之前做的vue项目中:

  output: {path: config.build.assetsRoot,filename: '[name].js',publicPath: process.env.NODE_ENV === 'production'? config.build.assetsPublicPath: config.dev.assetsPublicPath},

  接着找到config中的,build中的如下:

    assetsPublicPath: '/bbg/wechat2/',

  即我们在服务器上使用资源,尤其是使用node作为本地服务器时,如果publicPath设置有问题,就无法获取资源。

  比如,我们在使用node作为服务器端的时候,在app.get()时返回一个html页面,这个页面中使用link引入了外部css文件或者使用script引入了外部js文件,这时先进行打包,然后再运行这个文件,那么我们就可以发现报错404, 这时,在node端添加下面的几行代码:

// serve pure static assets
var staticPath = path.posix.join('/', 'static')
app.use(staticPath, express.static('./static'))

  即放在server端的纯静态文件,这样,就不会报出404错误了。

8. 在使用react、webpack配置时,可以发现我们html的末尾添加了bundle.js(注意: 这是我提前就添加好的,而不是让webpack自动添加的),那么这个bundle.js由于打包到了dist下而没有到static下,所以在引用时还会出现404错误,这个应该怎么解决呢?

  解决方法一:最简单的解决方法当然是直接将打包的文件打包到static下,而不是dist下,但是这样的项目是难以理解的。 经过尝试: 确实是可行的。

  解决方法二:即我们只是希望在开发环境中使用(dev), 而不是在生产环境中使用,其实和vue-cli生成的项目类似,我们是没有必要将bundle.js打包到dist下的,而是直接运行起来即可。

  

webpack查缺补漏相关推荐

  1. EFCore查缺补漏(二):查询

    相关文章: EFCore查缺补漏 第 20 轮 TechEmpower 评测结果出炉了,ASP.NET Core 的 Plaintext 成绩名列前茅,带着 EFCore 的测试却在 Single q ...

  2. I2C总线学习—查缺补漏—S3C2440的I2C控制器

    I2C总线学习-查缺补漏-S3C2440的I2C控制器                  学习了IIC总线协议的理论部分,觉得应该学习具体操作2440的IIC控制器,毕竟最终都是为了学习S3C2440 ...

  3. I2C总线学习—查缺补漏—应答信号ACK

    I2C总线学习-查缺补漏-应答信号ACK           IIC协议规定,当主机作为接收设备时,主机对最后一个字节不应答,以向发送设备(从设备)标识数据传送结束.这是因为每次传输都应得到应答信号后 ...

  4. I2C总线学习—查缺补漏—对数据有效性的思考

    I2C总线学习-查缺补漏-对数据有效性的思考 IIC协议规定:SDA上传输的数据必须在SCL为高电平期间保持稳定,SDA上的数据只能在SCL为低电平期间变化.IIC期间在脉冲上升沿把数据放到SDA上, ...

  5. 查缺补漏:集和与非平凡属性

    查缺补漏:集和与非平凡属性 前面的习题和知识点补充 Conjunctive normal form(CNF)是布尔逻辑的一种方法,它将公式表示为带有AND或or的子句的连词.由连词or AND连接的每 ...

  6. 赫斌老师数据结构视频查缺补漏笔记

    赫斌老师数据结构视频查缺补漏笔记 观看学习赫斌老师数据结构的视频,记录下自己之前学习这块内容时似懂非懂的知识,仅针对自己查缺补漏使用 视频链接:<郝斌老师数据结构自学视频> 1.指针的大小 ...

  7. C++查缺补漏之异常(续)

    此文是文章<C++查缺补漏之异常>:http://blog.csdn.net/ii1245712564/article/details/44617881的后续 1.异常的重新抛出 可能单个 ...

  8. 「查缺补漏」高频考点浏览器面试题

    前言 想要成为一名合格的前端工程师,掌握相关浏览器的工作原理是必备的,这样子才会有一个完整知识体系,要是「能参透浏览器的工作原理,你就能解决80%的前端难题」. 这篇梳理的话,更多的是对浏览器工作原理 ...

  9. MySQL查缺补漏 从无到有

    MySQL查缺补漏 从无到有 有这一篇就够了 数据库概述 SQL概述 什么是数据库 MySQL概述 SQL的分类 DOS命令窗口使用MySQL的基本命令 查看MySQL的版本 进入MySQL 导入数据 ...

最新文章

  1. 软件定义光网络-SDON
  2. anr trace文件分析
  3. saltstack管理saltstack认证相关
  4. 查找数组中未出现的和出现2次的数值 Set Mismatch
  5. Visual C++——LoadBitmap加载位图的操作过程
  6. 20179311《网络攻防实践》第一周作业
  7. python空格怎么加密_使用Python的RSA加密
  8. 家境一般但被中外合资大学录取了,现在家庭气氛紧张
  9. iPhone 7 P适合什么系统?
  10. 如何进行软件需求分析
  11. 网络盒子安装 linux,天猫魔盒安装原生linux的一些初步成果
  12. 基于stm32F4的项目总结:控制层设计(四)直流有刷电机驱动原理及驱动器选型
  13. jpg格式电脑怎么弄_jpg图片格式如何操作
  14. 如何免费设置QQ空间背景音乐
  15. windows 资源管理器已停止工作的解决办法
  16. 四、Solr数据源配置(JNDI、DIH)及定时重做索引
  17. 2021春招已正式开启,阿里巴巴企业智能事业部内推,有意者看下文!
  18. 惠普服务器找不到阵列,HP服务器RAID设置方法介绍
  19. k易语言html导入超级列表框,易语言超级列表框通用数据导入导出
  20. 计算机组成原理基础(转载)

热门文章

  1. ga设置迭代次数_种群进化+邻域搜索的混合算法(GA+TS)求解柔性作业车间调度问题(FJSP)算法介绍...
  2. 20220123:力扣第277场周赛(上)
  3. clickhouse-小结 mutation操作 视图
  4. VB快速查找大型文件中包含的字符串
  5. 搞AI的产品经理该怎么写PRD?谷歌的导师教你
  6. 马斯克发推:8月特斯拉Autopilot实现完全自动驾驶
  7. 日本用活体肌肉构建机械臂,人类与机器融合取得新突破
  8. opencv进行5种图像变化:
  9. 高博的一起做RGB-D SLAM 简单总结的流程框图
  10. 使用extundelete恢复测试liunx的删除文件