webpack 一
2016-07-27 00:10 孤独大兔子 阅读(158) 评论(0) 收藏 举报检测node是否安装 node -v
检测npm是否安装 npm -v
安装webpack
npm install -g webpack
检测安装是否成功直接输入webpack,如果出现一堆如下的内容,说明安装成功了

下面新建一个项目,我在D盘下创建,输入如下代码
mkdir webpack //创建一个webpack文件夹 cd webpack //进入webpack文件夹 npm init //会引导你创建一个package.json文件,包括名称、版本、作者这些信息等,会提示你输入一些基本信息,一路按回车就行

创建完成后,在D盘下多了一个webpack文件夹,在文件夹里面有一个文件package.json
接下来创建如下结构的目录
- /app
- index.js
- sub.js
- package.json
- webpack.config.js
添加了一个文件夹app和两个js文件,比较重要的是外面的webpack.config.js配置文件
js代码
sub.js
//我们这里使用CommonJS的风格 function generateText() { var element = document.createElement('h2'); element.innerHTML = "Hello h2 world"; return element; } module.exports = generateText;
index.js var sub = require('./sub'); var app = document.createElement('div'); app.innerHTML = '<h1>Hello World</h1>'; app.appendChild(sub()); document.body.appendChild(app);
写完后实现了简单的功能,创建了一个module,然后在另一个里面引用他
但我们的目标是合并成一个文件,并引用,为了省去这些麻烦
安装一个plugin,可以自动快速的帮我们生成HTML
npm install html-webpack-plugin --save-dev
创建完后,在目录下就会多出来一个文件夹node_modules

接下来写重要的部分,配置webpack.config.js
var path = require('path'); var HtmlwebpackPlugin = require('html-webpack-plugin'); //定义了一些文件夹的路径 var ROOT_PATH = path.resolve(__dirname); var APP_PATH = path.resolve(ROOT_PATH, 'app'); var BUILD_PATH = path.resolve(ROOT_PATH, 'build'); module.exports = { //项目的文件夹 可以直接用文件夹名称 默认会找index.js 也可以确定是哪个文件名字 entry: APP_PATH, //输出的文件名 合并以后的js会命名为bundle.js output: { path: BUILD_PATH, filename: 'bundle.js' }, //添加我们的插件 会自动生成一个html文件 plugins: [ new HtmlwebpackPlugin({ title: 'Hello World app' }) ] };
这样就配置好了,在根目录下输入webpack,系统显示一些信息,就成功了

成功后,会多出一个build的文件夹,里面有两个文件,一个是bundle.js,另一个是index.html,打开index.html,发现js文件已经插入进去了

bundle.js的内容很多看不懂,但他是先加载了index.js,后加载了subjs
二、配置webpack-dev-server
每次修改页面的时候,我们都要输入一遍webpack命令,然后重新刷新页面才能实现刷新,如果要实现自动更新,就要安装webpack-dev-server
输入
npm install webpack-dev-server --save-dev
完成后,在node_modules中会多出一条记录,上面的一个是我们之前装的plugin

安装完成后,在webpack.config.js中添加配置
module.exports = { .... devServer: { historyApiFallback: true, hot: true, inline: true, progress: true, }, ... }
然后再package.json里面配置一下运行的命令,npm支持自定义一些命令
... "scripts": { "start": "webpack-dev-server --hot --inline" }, ...
配置完成后,在命令行输入 npm start,然后在浏览器中输入http://localhost:8080/ 刚才的页面也同样出来了
但神奇的是,只要修改文件,不用刷新页面,会自动更新

三、添加样式
现在来添加一些样式,webpack使用loader的方式来处理各种各样的资源,样式文件我们需要两种loader,css-loader 和 style-loader,css-loader会遍历css文件,找到所有的url(...)并且处理。style-loader会把所有的样式插入到你页面的一个style tag中。
安装loader
npm install css-loader style-loader --save-dev
添加完成后,同样是在node_modules中添加了两个文件夹

然后配置webpack.config.js
devServer: {
...
},
module: { loaders: [ { test: /\.css$/, loaders: ['style', 'css'], include: APP_PATH } ] }, ...
然后新建一个css文件main.css(在app文件夹下)
另外,在入口文件index.js中引用
require('./main.css');
大功告成,文字变成了红色,插入到了style标签中
如果要用sass同理,安装关于sass的loader
npm install sass-loader --save-dev
稍微修改一下config,删掉我们先前添加的css规则,加上下面的loader
{ test: /\.scss$/, loaders: ['style', 'css', 'sass'], include: APP_PATH },
四、处理图片和其他静态文件
webpack可以将图片自动转成base64编码
安装url-loader
npm install url-loader --save-dev
配置webpack.config.js
{ test: /\.(png|jpg)$/, loader: 'url?limit=40000' //图片大小小于这个限制的时候,会自动启用base64编码图片 }
五、添加第三方插件
用npm来管理依赖,安装query和moment的支持
npm install jquery moment --save-dev
同样在node_modules里会多出文件夹
在js中引用
var sub = require('./sub'); var $ = require('jquery'); var moment = require('moment'); var app = document.createElement('div'); app.innerHTML = '<h1>Hello World it</h1>'; document.body.appendChild(app); app.appendChild(sub()); $('body').append('<p>look at me! now is ' + moment().format() + '</p>');
成功了,如果要支持ES6,要安装babel
npm install babel-loader babel-preset-es2015 --save-dev
配置webpack.config.js
... { test: /\.jsx?$/, loader: 'babel', include: APP_PATH, query: { presets: ['es2015'] } }, ...
现在可以改掉CommonJS风格的文件了
sub.js export default function() { var element = document.createElement('h2'); element.innerHTML = "Hello h2 world hahaha"; return element; }
index.js import './main.scss'; import generateText from './sub'; import $ from 'jquery'; import moment from 'moment'; let app = document.createElement('div'); const myPromise = Promise.resolve(42); myPromise.then((number) => { $('body').append('<p>promise result is ' + number + ' now is ' + moment().format() + '</p>'); }); app.innerHTML = '<h1>Hello World it</h1>'; document.body.appendChild(app); app.appendChild(generateText());
webpack是用一个配置文件来控制所有的打包,所有的魔力都是在这一个文件中发生的。 当然你不配置也可以,需要手动去敲更多的命令来执行,这个配置文件主要分为三大块
- entry 入口文件 让webpack用哪个文件作为项目的入口
- output 出口 让webpack把处理完成的文件放在哪里
- module 模块 要用什么不同的模块来处理各种类型的文件
所有安装都装在node_module中
-------------------------------------------------------------------------------
项目2--打包管理
新建一个项目,同上面一样,输入 npm init ,生成package.json (这一步都一样)
然后创建一个html文件,和一个js文件
<!-- index.html -->
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<h1 id="app"></h1>
<script src="bundle.js"></script>
<!-- 本身没有这个文件,只有下面的entry.js文件,这个文件将通过webpack生成 -->
</body>
</html>
/*** entry.js ***/ document.getElementById('app').innerHTML="这是我第一个打包成功的程序";
然后运行webpack,生成bundle.js
webpack entry.js bundle.js
再来创建一个js文件
/***first.js***/ var h2= document.createElement("h2") h2.innerHTML="不是吧,那么快第二个打包程序啦!"; document.body.appendChild(h2);
然后修改entry.js
document.getElementById('app').innerHTML="这是我第一个打包成功的程序"; //添加 require("./first.js");
然后重新执行,发现first.js的内容也被打包进去了
----------------------------------------------------
这篇最后一点内容,常用命令
webpack #最基本的启动webpack命令 webpack -w #提供watch方法,实时进行打包更新 webpack -p #对打包后的文件进行压缩 webpack -d #提供SourceMaps,方便调试 webpack --colors #输出结果带彩色,比如:会用红色显示耗时较长的步骤 webpack --profile #输出性能数据,可以看到每一步的耗时 webpack --display-modules #默认情况下 node_modules 下的模块会被隐藏,加上这个参数可以显示这些被隐藏的模块
@
浙公网安备 33010602011771号