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
 8- body{ 
 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
 15- const 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
 23- console.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 
 2- console.log("这是 入口文件 ..."); 
 ...
- index.html文件引入- 1 - <script src="bundle.js"></script>