webpack
webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。
学习建议
文档文档文档,所以的一切根源都来自于文档。
文档永远是首选资源。国外技术文档大多英文为主,国内翻译者会把文档翻译成中文文档。可以通过中文文档入门,再通过英文文档看是翻译是否有语意错误或者遗漏的地方。
开发者笔记。可以在简书、知乎搜多相关开发者的笔记,笔记是开发者看文档后的小结,有一定意义的借鉴作用,但要注意版本问题。
开发问题。可以在其 Github 、stackoverflow 或者 思否,查询开发者在使用这个工具、插件、库时候遇到的问题。
视频辅助。查看录制视频。
请教身边的小伙伴。
参照 DEMO 体验完成。
学习建议
- 查看官网文档 - 概念,了解 webpack 及其相关方法概念,分清楚 入口、输出、loader、插件的概念。
- 查看官网文档 - 指南,一步步体验。
- 查看官网文档 - loader, 搜索出 less-loader,对 less 文件进行打包编译尝试。
- 登录 Babel 官网查看,点击文档中配置 ,在选择你的工具中构建系统选择 Webpack 然后按指示配置,对 ES6 进行打包编译尝试。
- 体验以下DEMO,和使用了那些插件做了些什么,为什么要这么写。之后保证在不看 DEMO 的前提下也能配置出自己的 Webpack 打包配置方案,对 Less/Sass 及 ES6 进行转译处理。
如果通过文档的方式不能深入理解,请领取视频配合学习。
DEMO
通过一下例子,体验 webpack ,使用 ES6 import 、Less 、Vue 打包一个小模块。
- 全局安装 webpack
npm install webpack webpack-cli -g
- 创建项目文件夹并进入
cd ~/Desktop && mkdir webpack-init && cd webpack-init
- 初始化 package ,输入命令后一路回车。
npm init
- 下载各种依赖包,其中包括
webpack
webpack-cli
webpack-merge
clean-webpack-plugin
uglifyjs-webpack-plugin
ES6
- babel-loader
- @babel/core
- @babel/preset-env
file
- url-loader
- file-loader
Less
- style-loader
- css-loader
- less-loader
- less
Vue
- vue
- vue-loader
- vue-template-compiler
npm install webpack webpack-cli webpack-merge clean-webpack-plugin uglifyjs-webpack-plugin @babel/core babel-loader @babel/preset-env url-loader file-loader style-loader css-loader less-loader less vue vue-loader vue-template-compiler --save-dev
- 在根目录下创建 .babelrc 文件,并编辑
touch .babelrc
{
"presets": ["@babel/preset-env"]
}
- 在根目录下创建 webpack.config.js 文件,并编辑
const path = require('path');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const VueLoaderPlugin = require('vue-loader/lib/plugin');
module.exports = {
entry: {
app: './src/js/app.js'
},
output: {
filename: '[name].bundle.js',
path: path.resolve(__dirname, 'dist')
},
plugins: [
new VueLoaderPlugin(),
new CleanWebpackPlugin(['dist']),
],
module: {
rules: [{
test: /\.(css|less)$/,
use: [{
loader: "style-loader"
}, {
loader: "css-loader"
}, {
loader: "less-loader"
}]
},
{
test: /\.(png|svg|jpg|gif)$/,
use: [
'url-loader'
]
},
{
test: /\.(ttf|eot|woff(2))(\?[a-z0-9]+)?$/,
loader: 'file-loader',
},
{ test: /\.js$/, exclude: /node_modules/, loader: "babel-loader" },
{ test: /\.vue$/, loader: 'vue-loader' }
]
},
resolve: {
alias: {
'vue$': 'vue/dist/vue.esm.js'
}
}
};
- 在根目录下创建 webpack.dev.js 文件,并编辑
const merge = require('webpack-merge');
const common = require('./webpack.config.js');
module.exports = merge(common, {
mode: 'development',
devtool: 'inline-source-map',
devServer: {
contentBase: './dist'
}
});
- 在根目录下创建 webpack.prod.js 文件,并编辑
const merge = require('webpack-merge');
const webpack = require('webpack');
const UglifyJSPlugin = require('uglifyjs-webpack-plugin');
const common = require('./webpack.config.js');
module.exports = merge(common, {
mode: 'production',
devtool: 'source-map',
plugins: [
new UglifyJSPlugin({
sourceMap: true
}),
new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify('production')
})
]
});
- 创建开发文件目录 src 并对里面结构进行编辑
|-webpack-init
| ├ ...
| ├ src
| | ├ js
| | | ├ app.js
| | | ├ app.vue
| | | ├ print.js
| | ├ img
| | | ├ avatar.png
| | ├ less
| | | ├ app.less
添加图片 src/img/avatar.png
src/less/app.less
html {
min-height: 100%;
background: #f5f5f5;
}
src/js/print.js
const printMe = () => {
console.log('I get called from print.js!');
}
export default printMe;
src/js/app.vue
<template>
<div>
<div class="example">{{ msg }}</div>
<img :src="avatar_url">
</div>
</template>
<script>
import Avatar from './../img/avatar.png';
export default {
data () {
return {
msg: 'Hello world!',
avatar_url: Avatar,
}
}
}
</script>
<style lang="less">
.example {
color: red;
}
</style>
src/js/app.js
// Less
import './../less/app.less';
// ES6
import printMe from './print.js';
printMe();
// Vue
import Vue from 'vue'
import App from './app.vue'
new Vue({
el: '#app',
render:h=>h(App)
})
- 在根目录中创建 index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>webpack-init</title>
</head>
<body>
<div id="app"></div>
<script type="text/javascript" src="dist/app.bundle.js"></script>
</body>
</html>
- 配置 package 中 scripts
{
...,
"scripts": {
"start": "webpack --config webpack.dev.js",
"build": "webpack --config webpack.prod.js"
},
...
}
- 运行
npm start
观察dist目录,并打开 index.html 查看效果
参考代码
https://github.com/zhuayu/webpack4-init