webpack 使用
webpack是近期最火的一款模块加载器兼打包工具,它能把各种资源,例如JS(含JSX javascript xml)、coffee、样式(含less/sass)、图片等都作为模块来使用和处理。
文档地址:http://webpack.github.io/docs/
使用loader转换文件
记住三点,入口(entry),出口(output),规则(loader)
规则就是用相应的loader模块打包相应的文件。
特点
webpack 是以 commonJS 的形式来书写脚本的,但对 AMD/CMD 的支持也很全面,方便旧项目进行代码迁移。
AMD[Asynchromous Module Definition]:RequireJS 在推广过程中对模块定义的规范化产出。
CMD[Common Module defined]:SeaJS 在推广过程中对模块定义的规范化产出。
CommonJS规范
作用:让js不仅可以运行在浏览器端,还可以运行在服务器端。
CommonJS定义的模块分为:
{模块引用(require)} ->require()用来引入外部模块
{模块导出(exports)}->exports对象用于导出当前模块的方法或变量,唯一的导出口
{模块标识(module)} defined ->module对象就代表模块本身
能被模块化的不仅仅是 JS 了。png coffee less&sass
开发便捷,能替代部分 grunt/gulp 的工作,比如打包、压缩混淆、图片转base64等。
扩展性强,插件机制完善,特别是支持 React 热插拔(见 react-hot-loader )的功能让人眼前一亮
安装及使用
安装
mkdir course-webpack
(不要大写P)cd course-webpack
npm init
- 全局安装
cnpm i webpack@3.8.1 -g
(3.8.1版本的稳定) - 开发依赖
cnpm i webpack@3.8.1 -D
- 安装css项目打包
使用
cnpm i css-loader style-loader -D
安装支持css的打包坏境require('style!css!./style.css')
style与css的位置不能变cnpm i sass-loader node-sass -D
文件名后缀为
.scss
cnpm i less less-loader -D
文件名后缀为
.less
最后使用命令
webpack ***.*** bundle.js
将把暴露出来的各种文件打包到bundle.js里bundle: 捆; 包袱; 捆绑
w
配置
新建
webpack.config.js
文件(webpack配置文件)。写入:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33// webpack 配置文件
// 入口 entry
// 出口 output
// 规则 loader module
// 插件 plugins
// js css/scss/less png vue
module.exports = {
entry: "./entry.js",
output: {
filename: "bundle.js",
path: __dirname //双下划线
},
module: {
rules: [{
test: /\.css$/,
use: ['style-loader', 'css-loader']
}, {
test: /\.scss$/,
use: ['style-loader', 'css-loader', 'sass-loader']
}, {
test: /\.less$/,
use: ['style-loader', 'css-loader', 'less-loader']
}, {
test: /\.js$/,
exclude: /node_modules/, // 不会去 node_modules 搜索 打包文件
use: [
"babel-loader"
]
}]
},
devtool: "source-map", // 方便开发者调试
}配置规则(js可能需要配置es6,有的浏览器不识别es6语法)
cnpm i babel-loader@7.1.5 babel-core@6.26.3 babel-preset-env -D
新建
.babelrc
填写:1
2
3{
"presets":["env"]
}配置规则在
webpack.config.js
写入.js
的配置规则(上面已写)
热替换
cnpm i webpack-dev-server@2.9.3 -g
cnpm i webpack-dev-server@2.9.3 -D
- 在packjson中添加
"start":"webpack-dev-server --inline --hot --open"
下载
source-map
下载后配置
devtool: "source-map", // 方便开发者调试
webpack内各种文件的书写
.css
文件1
2
3
4
5
6
7
8body{
background: darkgreen;
color:#fff;
}
div{
border:4px solid darkorange;
font-size:60px;
}.scss
1
2
3
4
5
6
7
8
9$base_color:yellow;
body{
background: $base_color;
color:blue;
div{
border:4px solid darkorange;
font-size:60px;
}
}.less
1
2
3
4
5
6
7
8
9@base_color:yellowgreen;
body{
background: @base_color;
color:#fff;
div{
border:4px solid darkorange;
font-size:60px;
}
}.js
(下面包含部分es6)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15const arr = ["vue","react","angular4.0"];
let word = "天道酬勤!!!"
// 1. 解构导出
exports.arr = arr;
exports.word = word;
// module.exports = "hello everyone";
// js文件 无需打包 本身就是模块
// 模块导出
// module.exports = {}
// exports.a = a;入口文件
entry.js
(需新建)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23console.log("这是 入口文件 ...");
// ./ 表示同级文件 ../ 上一级文件 __dirname
// var {arr,word} = require("./name");
import {arr,word} from "./name";
// import obj from "./es6";
// console.log(obj);
import {msg,hello} from "./es6";
document.getElementById("app").innerHTML += "hello - webpack" + word + arr[0] + "<h2>"+msg+"</h2>" + hello;
// require("style-loader!css-loader!./style.css");
// require("style-loader!css-loader!sass-loader!./demo.scss");
// require("style-loader!css-loader!less-loader!./index.less");
// require("./style.css");
// require("./demo.scss");
// require("./index.less");
import "./demo.scss";出口文件webpack编译后
bundle.js
(需新建)1
2console.log("这是 入口文件 ...");
...index.html
文件引入1
<script src="bundle.js"></script>