webpack入门

1.入门

webpack网站:https://doc.webpack-china.org/ 

npm install webpack -g

但是官方不推荐,这会将项目中的webpack锁定到指定版本,并且在使用不同webpack版本的项目中,可能会导致构建项目失效。

npm init -y

npm install webpack --save-dev

webpack -v //查看版本

在终端中的语法:

webpack {entry file} {destination for bundled file}

e.g. webpack src/entry.js dist/bundle.js

2.webpack.config.js

//引用Node中的path模块

const path = require('path');

module.exports={
//入口文件配置
entry:{
entry:'./src/entry.js'
},
//出口文件配置
output:{
path:path.resolve(__dirname,'dist'),
filename:'bundle.js'
},
//模块,例如解读CSS,图片如何转换,压
module:{},
//插件,用于生产模板和各项功能
plugins:[],
//配置webpack开发服务功能
devServer:{}
}

 这个代码写完后,可以在终端中直接输入webpack就会进行打包。

多入口文件:

3.设置webpack-dev-server

npm install webpack-dev-server --save-dev

/webpack.config.js:

devServer:{

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

host:'localhost',

compress:true,

port:1717

}

在终端中输入 webpack-dev-server 。也可以在package.json中'scripts'写'server':'webpack-dev-server',然后npm run server;

4.Loaders

Loaders是webpack的重要功能,通过使用不同的loader,webpack可以对不同文件格式进行特定处理。

举例:可以把SASS文件写法转换成CSS,而不在使用其他转换工具。

            可以把ES6,ES7代码,转换成大多数浏览器兼容的JS代码。

            可以把React中的JSX转换成Javascript代码

注意:所有的Loaders都需要在npm中单独安装,并在webpack.config.js中进行配置

示例

在src/css文件夹下建立一个index.css

然后在/src/entry.js中首行加入代码:import css from './css/index..css';

npm install style-loader --save-dev

npm install css-loader --save-dev

引入代码压缩模块,const uglify = require('uglifyjs-webpack-plugin'); 然后在plugins new uglify();

5.打包HTML文件

假设src目录中有个index.html 这个HTML文件不应当包含任何script引入标签,因为这个任务应该交给webpack来执行:

在webpack.config.js中,先引入我们的html-webpack-plugin

const htmlPlugin = require('html-webpack-plugin');

引入后用npm进行安装

npm install html-webpack-plugin -save-dev

最后在webpack.config.js里对plugins进行插件配置

new htmlPlugin({

          minify:{ removeAttributeQuotes:true},

          hash:true,

          template:'./src/index.html'

})

.. 终端中输入webpack, 在dist文件夹下查看已经生成的文件

6.CSS中图片的处理

如果HTML中有<div>里面的background是url图片地址,

直接用webpack是会报错的,需要使用file-loader和url-loader

npm install file-loader url-loader --save-dev

*url-loader已经封装了file-loader的功能(我也不懂为啥要分开装。。反正上面说那就这样吧)

option中的limit会对图片大小判断,如果是5000b以下则会使用Base64编码(也就是一大串乱码)

7.CSS分离

实际开发中可能需要我们单独分离出CSS样式

直接使用npm install安装就可以。

npm install --save-dev extract-text-webpack-plugin

安装后在webpack.config.js中用require引入

const extractTextPlugin = require('extract-text-webpack-plugin');

在plugins属性中进行配置

new extractTextPlugin('/css/index.css')

然后修改一下原来我们的style-loader和css-loader

运行webpack进行打包,dist目录下会生成css文件夹

这样的话图片是不会显示的,有一个比较通用的解决方法是:

8.HTML中图片打包

1.如何使用本地环境下的webpack呢?

答:在package.json的"script"中写一行 "build":"webpack",然后npm run build

2.如何让打包的图片也能在某个文件夹内输出?

答:在url-loader的options里写一行outputPath:'images/'(例如limit:5000,outputPath....)

Webpack官方不推荐你使用img标签,而是希望你完全使用Javascript,

如果使用了带src属性的img标签,那么打包出来的图片是不会显示的。

有一款国人的插件 html-withimg-loader

9.打包和分离LESS,SASS

1.怎么让webpack-dev-server自动在新的标签页弹出

答:在package.json的“scripts”中 "server":"webpack-dev-server --open" 加上--open这个参数

LESS:

npm install less --save-dev

npm install less-loader --save-dev

 
对webpack.config.js进行配置
{
test:/\.less$/,
use:[{
loader:"style-loader"
},{
loader:"css-loader"
},{
loader:"less-loader"
}]
}
 
在src/css下建立less文件进行编写,在entry.js中import less from './css/xxx.less'
进行webpack打包
 
设置分离:
分离后打开dist/css/index.css就能发现已经转换好了。
 
SASS:
npm install --save-dev node-sass sass-loader
npm install --save-dev sass-loader
 
 
{
test:/\.scss$/,
use:[{
loader:"style-loader"
},{
loader:"css-loader"
},{
loader:"sass-loader"
}]
}
 
分离代码:
{
test:/\.scss/,
use:extractTextPlugin.extract({
use:[{
loader:"css-loader"
},{
loader:"sass-loader"
}],
fallback:"style-loader"
})
}
 
 
 
10.POSTCSS的使用

浏览器的内核:

1.IE Trident
2.Safari Webkit
3.Chrome Blink
4.Firefox Gecko
5.Opera Presto

postcss-loader作用是给css3属性加一下浏览器兼容的前缀

npm install --save-dev(-D) postcss-loader autoprefixer

在webpack.config.js同级目录下新建postcss.config.js 

module.exports={
plugins:[
require('autoprefixer'),
]
}
 
 
 
11.PurifyCSS的使用
 
npm i -D purifycss-webpack purify-css
(npm install --save-dev purifycss-webpack)
(npm install --save-dev purify-css) 
(必须要安装这两个,因为前面的依赖后面的)
 
const PurifyCSSPlugin = require("purifycss-webpack");
const glob = require('glob');
 
new PurifyCSSPlugin({
paths:glob.sync(path.join(__dirname,'src/*.html'))
})
 
进行webpack打包,如果css中写了多余代码而没用到,那么在dist生成的css中则不会有这段冗余的代码
 
 
12.babel的使用
 
npm install --save-dev babel-core babel-loader babel-preset-es2015 babel-preset-react
 
{
test:/\.(jsx|js)$/,
use:{
loader:"babel-loader",
options:{
presets:["es2015","react"]
}
},
exclude:/node_modules/
}
 
npm run build
 
因为后期babel配置项可能会比较多,不建议直接写在webpack.config.js的options中
 
建议新建一个.babelrc进行配置
 
babelrc里传入一个对象:
 
(这里写错了,应该是presets,懒得截图了)然后npm run build,也打包成功了。
 
 
*目前官方推荐的最新的转换器是babel-preset-env,可以转换es7,es8...
 
npm install --save-dev babel-preset-env
 
然后修改.babelrc
然后用webpack打包,也成功了。
 
 12.DEV-TOOLS
 
source-map 独立 map 行 列(第五行第25个字符错误)
cheap-module-source-map 独立 行 不包括列(第五行有错误)
都生成独立文件
 
例如
 
用webpack打包,在dist目录下会有entry.js.map这个独立的文件。
 
eval-source-map 可能会有性能和安全的隐含(在开发阶段用,不要在生产上线阶段用) 行 列
cheap-module-eval-source-map  行 不包括列
 
 
 13.依赖及生产、开发环境
 
npm install --save-dev jQuery 开发环境
npm install --save jQuery 生产环境
 
npm install --production 只安装package.json生产环境中的依赖包
 
生产环境的及开发环境的配置:
package.json 注意这个语法, set type=xxx&webpack 
 
webpack.config.js 
 
 
 14.webpack模块化开发
 
例如在src下新建一个alert.js:
function a(){
alert('哈!')}
 
module.exports = a;
 
在entry.js中引入import ss from './alert.js';
ss();
 
npm run dev...
npm run server...
 
 
在目录下建立一个空文件夹webpack_config,
可以将webpack模块化配置写在这里。
 
在里面新建一个entry_webpack.js
const entry = {};
entry.path = {
     entry: './src/entry.js'
}
 
module.exports = entry;
 
在webpack.config.js中:
const entry = require('./webpack_config/entry_webpack.js');
 
然后进行配置:
 
 

 14.打包第三方类库
 
npm install --save jquery
在entry.js中,import $ from 'jquery',写一些jquery代码。
打包后就发现可以运行Jq代码了。
 
还有一种方法引入:
在webpack.config.js中:
const webpack = require('webpack');
使用webpack.ProvidePlugin 
 
 
 15.webpack --watch配置项(热打包)
 
 
webpack --watch
 
 
版权banner插件的使用:
首先要const webpack = require('webpack');
 
效果:
 
15.webpack 优化
 
前面学了两种引用Vue和jquery的方法,
 
第一种是在entry.js中import,然后使用。
 
第二种是在plugins中 
new webpack.ProvidePlugin({
$:"jquery"
}),
 
如果entry.js中没用到Jquery语法的代码的话第一种方法打包后仍然占据空间。
第二章方法如果把这段注释掉就不占据空间了。
这里学习一种抽离插件的方法。
 
抽离插件,入口处写法:
 

 使用webpack.optimize.CommonsChunkPlugin,

运行webpack命令

16.集中拷贝静态资源

npm install --save-dev copy-webpack-plugin

const copywebpackPlugin = require('copy-webpack-plugin');
配置:
 
 

热更新:

new webpack.HotModuleReplacementPlugin()

原文地址:https://www.cnblogs.com/eret9616/p/7999536.html