webpack,用起来利器,学起来懵*,还变的快~~~ 做笔记,加深记忆。
作用:
- 代码转化
- 文件压缩
- 代码分割
- 自动刷新
- 代码校验
核心概念:
- entry:入口
- module:模块,webpack从entry开始,递归找出所有依赖的模块
- chunk:代码块。
- loader:模块转化配置。 将原内容按配置转化
- plugin:扩展插件
- output:输出结果
- webpack启动后,从entry里配置的module开始递归解析entry依赖的所有module,再根据配置的loader对module进行转换。
- 一个entry和其所依赖的module组成一个chunk代码块。
单页面SPA入口:
module.exports = {
entry: './main.js'
}复制代码
多页面MPA入口:
entry: {
home: "./home.js",
about: "./about.js",
contact: "./contact.js"
}复制代码
输出
- path:输出位置。eg:path: path.join(__dirname, '../dist')
- publicPath:针对打包后,静态文件的位置
- filename:定义每个输出bundle的名称。
filename: "bundle.js" filename: "[name].bundle.js" filename: "[id].bundle.js" filename: "[name].[hash].bundle.js" filename: "[chunkhash].bundle.js" 复制代码
module模块
处理不同模块,主要在rules中
module: {
rules: [
{
test: /\.(vue|js|jsx)$/, //处理对象,一般用正则标识文件后缀
loader: 'eslint-loader', //处理方案,不同的loader
exclude: /node_modules/, //规则忽略文件
enforce: "pre" //预处理
},
{
test: /\.vue$/,
loader: 'vue-loader',
options: createVueLoaderOptions(isDev) //option-loader的选项
},
...
{
test: /\.css$/,
use: [ //loader集合
'style-loader',
'css-loader'
]
},
{
test: /\.(gif|jpg|jpeg|png|svg)$/,
use: [{ //use是useEntry(loader和他的option)的集合
loader: 'url-loader',
options: {
limit: 1024,
name: 'resources/[path][name].[hash:8].[ext]'
}
}]
},
]
}复制代码
resolve
引入模块时,可以不用扩展名
alias: //用的多的就是
resolve: {
//引入模块的时候,可以不用扩展名
extensions: [".js", ".less", ".json"],
alias: { //别名
"@": "./src/"
}
},复制代码
----------------------------------------------------------------------------------------
这货的知识太杂了,记一个实际项目搭建中的用到的。
webpack.config.base.js //放置完全公共的东西
const path = require('path')
const createVueLoaderOptions = require('./vue-loader.config')
const isDev = process.env.NODE_ENV === 'development'
const config = {
//mode: process.env.NODE_ENV || 'production',
target: "web",
entry: path.join(__dirname, '../client/index.js'),
output: {
filename: 'bundle.[hash:8].js',
path: path.join(__dirname, '../dist'),
publicPath: "http://127.0.0.1:8000/public/"
},
module: {
rules: [
{
test: /\.(vue|js|jsx)$/,
loader: 'eslint-loader', //代码格式检测
exclude: /node_modules/, //exclude不用打包
enforce: "pre" //加入,预处理,不会和真正的预处理文件冲突
},
{
test: /\.vue$/,
loader: 'vue-loader',
options: createVueLoaderOptions(isDev) //使用vue-loader,配置单独打包css文件
},
{
test: /\.jsx$/,
loader: 'babel-loader'
},
{
test: /\.js$/,
loader: 'babel-loader',
exclude: /node_modules/ //exclude不用打包
},
{
test: /\.css$/,
use: [
'style-loader',
'css-loader'
]
},
{
test: /\.(gif|jpg|jpeg|png|svg)$/,
use: [{
loader: 'url-loader',
options: {
limit: 1024,
name: 'resources/[path][name].[hash:8].[ext]'
//静态文件归并位置,[name][path]配置过程中,都可以取到 [hash:8] hash值取8位
}
}]
},
]
}
}
module.exports = config
复制代码
webpack.config.client.js
const path = require('path')
const HTMLPlugin = require('html-webpack-plugin')
const webpack = require('webpack')
const merge = require('webpack-merge') //Merge合并参数
const ExtractPlugin = require('extract-text-webpack-plugin') //把css单独打包到一个文件中
const baseConfig = require('./webpack.config.base')
const VueClientPlugin = require('vue-server-renderer/client-plugin')
const isDev = process.env.NODE_ENV === 'development'
const defaultPlugins = [
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: isDev ? '"development"' : '"production"'
}
}),
new HTMLPlugin({
template: path.join(__dirname, 'template.html')
}),
new VueClientPlugin()
]
const devServer = {
port: '8000',
host: '0.0.0.0',
overlay: {
errors: true,
},
hot: true,
headers: {'Access-Control-Allow-Origin': '*'},
historyApiFallback: {
index: '/public/index.html'
}
//open: true
}
let config
if (isDev) {
config = merge(baseConfig, {
devtool: '#cheap-module-eval-source-map',
module: {
rules: [
{
test: /\.styl/,
use: [
'vue-style-loader', //vue开发的时候,热更替功能,使用vue-style-loader
'css-loader',
{
loader: 'postcss-loader',
options: {
sourceMap: true
}
},
'stylus-loader'
]
}
]
},
devServer,
plugins: defaultPlugins.concat([
new webpack.HotModuleReplacementPlugin(),
new webpack.NoEmitOnErrorsPlugin()
])
})
} else {
config = merge(baseConfig, {
entry: { //盖掉base.config.js中的配置
app: path.join(__dirname, '../client/index.js'),
vendor: ['vue']
},
output: {
filename: '[name].[chunkhash:8].js' //
},
module: {
rules: [
{
test: /\.styl/,
use: ExtractPlugin.extract({ //vue开发的时候,用热更替的功能,使用vue-style-loader
fallback: 'style-loader',
use: [
'css-loader',
{
loader: 'postcss-loader',
options: {
sourceMap: true
}
},
'stylus-loader'
]
})
}
]
},
/*optimization: {
splitChunks: {
chunks: 'all'
},
runtimeChunk: true
},*/
plugins: defaultPlugins.concat([
new ExtractPlugin('style.[contentHash:8].css'), //ExtractPlugin把css单独打包到一个css文件里面
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor'
}),
new webpack.optimize.CommonsChunkPlugin({
name: 'runtime'
})
]),
})
}
module.exports = config
复制代码
- css-loader 将CSS变成JS //
- style-loader将JS样式插入head //js样式由css-loader生成,
- extractTextPlugin // 将CSS从JS中提取出来
- css module //解决css命名冲突的问题
- less-loader sass-loader
- postcss-loader //PostCSS处理,做解析
html-webpack-plugin 生成html页面文件, 一般多页面时候用
extractTextPlugin 抽取文本,
uglifyjsplugin 合并压缩
commonsChunkPlugin 抽取公用模块 ,多页面时候用的多
clean-webpack-plugin 清除文件 打包文件之前
copy-webpack-plugin 文件复制
postcss:[
require('autoprefixer'){
browsers:['late 5 versions']
}
]
复制代码
webpack常用的loader
样式:style-loader、css-loader、less-loader、sass-loader等
文件:raw-loader、file-loader 、url-loader等
编译:babel-loader、coffee-loader 、ts-loader等
校验测试:mocha-loader、jshint-loader 、eslint-loader等
---------------------------------------------------------------------------
最后
parcel,了解一下。
小而美,费不着的时候,就别折腾web胖了。