webpack的基本使用
概念
webpack是一个现代的JavaScript应用程序的静态模块打包器。是处理各个文件之间依赖关系的工具。
当在代码中使用CommonJS模块化规范、ES6模块化规范或其他规范时,可以解决各个文件之间的相互依赖,并且读懂某些规范的含义。
CommonJS模块化规范举例:
导入与导出:
const { add, mul } = require('./mathUtils.js')
module.exports = {
add, mul
}
ES6模块化规范举例:
导入与导出:
import {name, age, height} from './info.js' //导入
export const name = 'why' //导出
export default function() { //导出默认值
console.log('18');
}
在没有用webpack前,代码本身是不能识别CommonJS模块化的。利用webpack就可以使浏览器识别模块。
一、webpack的起步
如果自己手动配置项目的话,首先在项目目录下创建两个文件夹,为dist与src文件夹,文件夹中的包含的文件如下:
在命令行输入:webpack ./src/main.js ./dist/bundle.js
,就会在dist文件夹中生成bundle.js文件。
其中,main.js文件表示项目的js入口文件,dist文件夹为项目发布时需要上传到服务器的文件夹,其中的bundle.js文件为输出文件。而index.html文件为运行项目的入口文件。
二、webpack的配置
1.首先使用下载node,利用node环境,以及node本身自带的npm(包管理工具)。
2.在文件夹中创建一个webpack.config.js文件,来配置文件的入口与出口,如下所示:
const path = require('path');
module.exports = {
entry: './src/main.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js'
}
}
3.在命令行输入npm init来生成package.json文件,来进行管理项目运行时所依赖的文件,创建的过程如下所示:(配置选择默认的就可以了)
获得的package.json文件内容大致如下:
{
"name": "meetwebpack",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "-",
"bulid": "webpack"
},
"author": "",
"license": "ISC",
"devDependencies": {
"webpack": "^3.6.0"
}
}
4.再利用npm install安装项目运行时依赖的文件(如webpack.config.js中的path文件)。
5.此时在终端输入webpack运行,就会发现webpack将生成新的文件即bundle.js文件(在dist文件夹),此时该文件已经解决的各个文件之间的模块依赖。
在package.json文件中输入输入以下代码,可以使在打包文件时,输入npm run build即可
三、webpack的loader
1.webpack中使用css文件的配置
①首先在src文件夹中创建一个css文件夹;
②在文件夹中创建一个normal.css文件;
③在main.js中用require('./css/normal.css')
导入这个文件;
④找到webpack官网1点击中文文档,找到loaders按钮。
⑤此时会看到关于loaders的简介(webpack可以使用loader来预处理文件);
⑥找到我们所需要的css-loader,进入之后会发现特别详细的介绍;
安装css-loader
npm install --save-dev css-loader
用法
webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: [ 'style-loader', 'css-loader' ]
}
]
}
}
⑦再次在命令行运行npm run build就会得到新打包好的文件。
2.webpack-less文件的处理
①在./src/css
文件夹中创建special.less
文件;
②在main.js
文件中利用require('./css/special.less')
导入文件;
③找到webpack官网点击中文文档,在loaders模块中找到less-loader;
安装less-loader
npm install --save-dev less-loader less
The less-loader requires less as peerDependency. Thus you are able to control the versions accurately.
module.exports = {
...
module: {
rules: [{
test: /\.less$/,
use: [{
loader: "style-loader" // creates style nodes from JS strings
}, {
loader: "css-loader" // translates CSS into CommonJS
}, {
loader: "less-loader" // compiles Less to CSS
}]
}]
}
};
④再次在命令行运行npm run build就会得到新打包好的文件
3.webpack-图片文件的处理
①在src
文件夹中创建img
文件夹,并放入一张图片src/img/cache.jpg
,图片大小约为40kb
;
②在normal.css
中利用background: url('../img/cache.jpg');
将图片设置为页面背景;
③找到webpack官网点击中文文档,在loaders模块中找到url-loader;
安装url-loader
npm install --save-dev url-loader
webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.(png|jpg|gif)$/,
use: [
{
loader: 'url-loader',
options: {
limit: 8192
}
}
]
}
]
}
}
url-loader 功能类似于 file-loader,但是在文件大小(单位 byte)低于指定的限制时,可以返回一个 DataURL。
④因为此时文件的大小大于限制的limit,所以进行编译时会出现错误,此时按照错误提示进行file-loader的安装即可(或将limit设置成大于图片大小,那么此时就不需要安装file-loader);
安装file-loader
npm install --save-dev file-loader
默认情况下,生成的文件的文件名就是文件内容的 MD5 哈希值并会保留所引用资源的原始扩展名。
注:若已经安装了url-loader,则此时不需要再在webpack.config.js中进行配置。
生成文件 file.png,输出到输出目录并返回 public URL。如
"/dist/0dcbbaa7013869e351f.png"
其中输出目录需要在webpack.config.js中进行配置,代码如下:(如果不配置publicPath,则打包产生的图片就会直接在src
文件夹中,不会存在dist
文件夹中,那么发布项目时就得不到想要的效果)
module.exports = {
entry: './src/main.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js',
publicPath: 'dist/' //涉及url的文件,都会在地址前加上dist/
},
......
}
此时生成的图片名称是由32位哈希值组成的,比较杂乱无章,可以在配置
url-loader
时,进行图片命名,代码如下(配置完成后,图片的地址就位于./dist/img/
文件夹中):
{
test: /\.(png|jpg|gif|jpeg)$/,
use: [{
loader: 'url-loader',
options: {
//当加载的图片小于limit时,会将图片编译成base64字符串形式
//当加载的图片大于limit时,需要使用file-loader模块进行加载
limit: 10000,
name: 'img/[name].[hash:8].[ext]'
}
}]
}
img:文件要打包到的文件夹
name:获取图片原来的名字,放在该位置
hash:8:为了防止图片名称冲突,依然使用hash,但是我们只保留8位
ext:使用图片原来的扩展名
④再次在命令行运行npm run build就会得到新打包好的文件,预览如下:
4.webpack-ES6转ES5的babel
①仔细阅读webpack打包的js
文件,会发现写的ES6语法并没有转换成ES5,那么意味着可能一些ES6还不支持的浏览器没有办法很好的运行我们的代码
②如果希望将ES6语法转换成ES5,那么就需要使用babel
③找到webpack官网点击中文文档,在loaders模块中找到babel-loader;
安装babel-loader
npm install --save-dev babel-loader@7 babel-core babel-preset-es2015
配置webpack.config.js
module: {
rules: [
{
test: /\.js$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: 'babel-loader',
options: {
presets: ['es2015']
}
}
}
]
}
④再次在命令行运行npm run build就会得到新打包好的文件,查看bundle.js
文件,发现其中的内容变成了ES5的语法。
5.webpack使用Vue的配置过程
①希望在项目中使用Vue.js,那么必须需要对其有依赖,所以需要进行安装;
安装vue
npm install vue --save
注:因为后续是在实际项目中也会使用Vue的,所以并不是开发时依赖
②在使用时首先导入Vue;
import Vue from 'vue' //此行导入vue
// import App from './vue/app.js'
import App from './vue/App.vue'
new Vue({
el: '#app',
template: `<App/>`,
components: {
App
}
})
③打包项目并运行程序,出现错误(错误说我们使用的是runtime-only版本的Vue),此时需要在webpack.config.js
中添加如下内容即可:
④再次在命令行运行npm run build就会得到新打包好的文件。
6..vue
文件的封装处理
①创建一个.vue
文件如下:
<template>
<div>
<h2 class="title">{{message}}</h2>
<button>按钮</button>
<Cpn></Cpn>
</div>
</template>
<script>
import Cpn from './Cpn.vue'
export default {
data() {
return {
message: 'hello webpack'
}
},
components: {
Cpn
}
}
</script>
<style scoped="scoped">
.title {
color: yellow;
}
</style>
②这个文件不能被正常的加载,所以需要安装vue-loader与vue-template-compiler
安装vue-loader与vue-template-compiler
npm install vue-loader vue-template-compiler --save-dev
③修改webpack.config.js
配置文件如下:
{
test: /\.vue$/,
use: ['vue-loader']
}
④再次在命令行运行npm run build就会得到新打包好的文件。
关于上述所依赖的包的版本如下:
webpack
npm install webpack@3.6.0
css-loader
npm install css-loader@2.0.2 --save-dev
style-loader
npm install style-loader@0.23.1 --save-dev
less-loader
npm install --save-dev less-loader@4.1.0 less@3.9.0
url-loader
npm install --save-dev url-loader@1.1.2
es6转换成es5
npm install --save-dev babel-loader@7.1.5 babel-core@6.26.3 babel-preset-es2015@6.24.1
Vue
npm install vue@2.5.21 --save