webpack简单学习笔记

webpack

  • 一种打包工具,很多模块打包成很少的静态文件

  • 特性:代码分割——项目加载时只加载需要的文件

loader

  • 可处理各种文件

  • 可以对文件之间的依赖进行处理,把文件打包成浏览器可以直接进行处理的js、css文件和图片

  • 适合大型项目

webpack区别于其他

  • 代码分割
  • loader
  • 插件
  • 模块

安装:

1.初始化npm

 npm init

2.使用npm来安装webpack

npm install --save-dev webpack //非全局安装

npm install -g webpack //全局安装

npm info webpack //查看webpack 版本信息

npm install webpack@1.31.x --save-dev //安装指定版本

3.打包文件

webpack {entry file} {destination for bundled file} //全局安装
node_modules/.bin/webpack app/main.js public/bundle.js  //前面固定,后面为要打包的文件路径名称和打包后的文件路径名称。这是webpack非全局安装的情况

打包后的js文件会生成一些webpack的内置函数,然后会生成模块编号

处理css文件需要另外安装

工具处理样式表

webpack提供两个工具处理样式表:css-loader 和 style-loader

二者处理的任务不同,css-loader能够使用类似@import 和 url(…)的方法实现 require()的功能,style-loader将所有的计算后的样式加入页面中,二者组合在一起能够把样式表嵌入webpack打包后的JS文件中

loader安装

npm install --save-dev style-loader css-loader

使用

用requre来引入css文件:require(‘style-loader!css-loader!.style.css’)

通常情况下,css会和js打包到同一个文件中,并不会打包为一个单独的css文件,不过通过合适的配置webpack也可以把css打包为单独的文件的

webpack file1 file2 --module-bind 'css=style-loader!css-loader --watch //自动更新改变

--progress //会出现读条 

--display-modules //会把打包的模块都列出来,包括处理方式 

--display-reasons //会把打包原因显示出来

一般npm安装位置

C:\Users\Administrator\AppData\Roaming\npm;

webpack配置

webpack.config.js

  devtool: 'eval-source-map',
  entry:  __dirname + "/app/main.js",//已多次提及的唯一入口文件
  output: {
    path: __dirname + "/public",//打包后的文件存放的地方
    filename: "bundle.js"//打包后输出文件的文件名
  }
}

如果webpack config不是默认的文件名

命令行:webpack –config fileName

也可以再package.json 中的scripts 中对“webpack”进行定义

"webpack": "webpack --config web.config.js --progress --display-moduled --colors --display-resons"

在命令行运行npm run webpack

entry属性

可配置唯一的入口,也可以是一个数组,也可以传入一个对象

数组情况下是webpack,想把两个平行的文件打包在一起 entry: [’’,’‘,…]

对象情况是不同页面分配不同的入口

entry:{
	main:'./src/script/main.js',
	a:'./src/script/a.js'
},

output属性

filename

path

在entry是输入对象的情况下需要对其进行占位符才可避免覆盖现象 占位符有[name]/[hash]/[chunkhash](保证唯一性)(MD5)

output:{
	path: '',
	filename:'js/[name]-[hash].js'(可设置相对路径)
}

publicPath:'http://cdn.com'(上线使用)(相当于占位符,替换根目录地址)

context属性

上下文

  • 自动生成项目中html的页面

webpack插件

html-webpack-plugin

这个插件的作用是依据一个简单的index.html模板,生成一个自动引用打包后的JS文件的新index.html。这在每次生成的js文件名称不同时非常有用(比如添加了hash值)。

安装

npm install --save-dev html-webpack-plugin

使用插件需要在配置文件中建立对插件的使用

const HtmlWebpackPlugin = require('html-webpack-plugin');
plugins: [  new HtmlWebpackPlugin({ template: __dirname + "/app/index.tmpl.html"//new 一个这个插件的实例,并传入相关的参数 }) ],
参数:template
filename:'index-[hash].html'
inject:'hesd'(脚本放置在头部)
minify:{ 
  removeComments:true,//删除注释
  collapseWhitespace:true//删除空格
}(压缩html)

传参

配置文件 title:”webpack “

模板文件

<title><%= htmlWebPackPlugin.optins.title %></title>
date: new Date()
<body><%= htmlWebPackPlugin.optins.date %></body>

多页面引用

  • 可再次调用webpackplugin,通过传参数,指定数据
  • 再new一个webpackplugin
  • 多个entry引入,需要修改每个plugin中的对应的filename

在标签中插入模块

在模板html中加入不带PublicPath的路径

<%= htmlWebpackplugin.file.chunks.main.entry.substr(htmlWebpackPlugin.files.publicPath.lenth) %>
<%= compilation.assets[htmlwebpackPlugin.file.publicPath.length)].source()%>

loaders

Loaders是webpack提供的最激动人心的功能之一了。

通过使用不同的loader,webpack有能力调用外部的脚本或工具,实现对不同格式的文件的处理,比如说分析转换scss为css,或者把下一代的JS文件(ES6,ES7)转换为现代浏览器兼容的JS文件,对React的开发而言,合适的Loaders可以把React的中用到的JSX文件转换为JS文件。

使用loaders有三种方式

  • 配置(推荐):在 webpack.config.js 文件中指定 loader。

  • 内联:在每个 import 语句中显式指定 loader。

  • CLI:在 shell 命令中指定它们。

在配置文件中指定loaders

在配置文件中

module:{
  loaders
}

Babel

Babel其实是一个编译JavaScript的平台,它的强大之处表现在可以通过编译达到以下目的:

  • 使用下一代的JavaScript代码(ES6,ES7…),即使这些标准目前并未被当前的浏览器完全的支持;

  • 使用基于JavaScript进行了拓展的语言,比如React的JSX;

Babel的安装与配置

Babel其实是几个模块化的包,其核心功能位于称为babel-core的npm包中,webpack可以把其不同的包整合在一起使用。

对于每一个需要的功能或拓展,都需要安装单独的包(用得最多的是解析Es6的babel-preset-es2015包和解析JSX的babel-preset-react包)。

一次性安装这些依赖包

npm一次性安装多个依赖模块,模块之间用空格隔开

npm install --save-dev babel-core babel-loader babel-preset-es2015 babel-preset-react
module: { 
	rules: [ 
		{ 
			test: /(\.jsx|\.js)$/, //匹配条件
			use: { loader: "babel-loader",//使用的loaders 
			options: { presets: [ "es2015", "react" ] //怎么处理js,关于一些需要转换的特性
		 } 
		}, 
		exclude: /node_modules/ } //已经是打包过的文件,排除掉
	] 
} 
};

resove解析

解析路径需要在webpack.config.js中配置

var path = require('path')

处理项目中的css

postcss-loader的使用指南

postcss的插件 autoprefixer 自动补全浏览器的前缀

postcss:
[
  require('autoprefixer')({broswers: ['last 5 versions']})//最新5个版本
],
{
  test:/\.css$/,
  loader:'style!css?importLoaders=1!postcss'
}

使用less 和 sass

npm install --save-dev less-loader less

如果未安装less还需要先安装less

npm install less

loader处理方式是从右到左

{
  test:/\.les$/,
  loader:'style!css!postcss!less'
},


{
  test:/\.sass$/,
  loader:'style!css!postcss!sass'
}

处理模板文件

安装html-loader

npm install html-loader --save-dev
{
  test:/\.html$/,
  loader:'html-loader'
}

处理图片以及其他文件

安装file-loader:

npm install --save-dev file-loader

增加规则

{
  test:/\.(png|jpg|gif|svg)$/i,
  loader:'file-loader'
}

如果图片引用绝对路径那可以通过

如果路径引用的是相对路径则需要把路径变成

<img src="${ require('../../assets/bg.png')}"/>

或者是在配置中设置占位符

{
	test:/\.(png|jpg|gif|svg)$/i,
	loader:'file-loader',
	option:{
		name:'assets/[name]-[hash:5].[ext]'
	}
}

安装 url loader

npm install --save-dev url-loader
  • url-loader 功能类似于 file-loader ,但是在文件大小(单位 byte)低于指定的限制时,可以返回一个 DataURL。

  • 当文件大于你指定的值时候,会把这个文件交给file loader处理,当文件小于你指定的值的时候,会自动打包成编码

      {
        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,//当文件大于10k时候,会把这个文件交给file loader处理,当文件小于10k时候,会自动打包成编码
          name: utils.assetsPath('img/[name].[hash:7].[ext]')
        }
      },

image-loader 来减小图片的大小,对图片进行压缩

安装

mpm install --save-dev imge-webpack-loader

配置

{
	test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
	loaders: [
		'url-loader? limit: 10000&name: utils.assetsPath('img/[name].[hash:7].[ext]'
		'image-webpack'
		]
},

webpack webpack中文文档