继续学习webpack4的一些配置总结

612 阅读2分钟

继上次发文,好像过了很长时间。。。


1. 初始化项目新建项目目录webpack4-demo

1.1 新建package.json文件,自动化产出 npm init 一路回车

1.2 为规范开发,可以引入代码风格检测,这里我用的是eslint-standard,安装相关依赖,我这里用的是淘宝的镜像源,npm 访问太慢,原谅我不会翻墙。

// eslint 相关插件依赖
cnpm i 
eslint
eslint-config-standard
eslint-plugin-standard 
eslint-plugin-promise 
eslint-plugin-import 
eslint-plugin-node 
eslint-plugin-html -D

相关依赖版本信息如下:

项目根目录下 新建.eslintrc文件,项目就开启了eslint检测,我用的是vscode,可以安装相关eslint插件

{
  "extends": "standard",
  "plugins": [
    "html",
    "standard",
    "promise"
  ],
  "parser": "babel-eslint",
  "parserOptions": {
    "sourceType": "module"
  },
  "rules": { // 自定义规则,行尾增加分号;
    "semi": ["error", "always"]
    }
}

eslint详细配置,可参考官网ESLint - Pluggable JavaScript linter

1.3 项目开发目录


2. 配置项目的webpack.config.js配置

2.1 在项目根目录下新建webpack.config.js,引入相关模块

const webpack = require('webpack'); // 引入webpack
const path = require('path'); // 引入路径模块
const glob = require('glob');
const HtmlWebpackPlugin = require('html-webpack-plugin');

2.2 获取多页面入口文件并生成html页面

// 获取入口文件
const entries = glob.sync('./src/**/index.js');
const entrys = {};
const htmlPlugins = [];
// 量产html
for (const path of entries) {
  const template = path.replace('index.js', 'index.html');
  var chunkName = (/.*\/(pages\/.*?\/index)\.js/.exec(path)[1]).replace(/pages\//g, '');
  // 生成入口文件
  entrys[chunkName] = path;
  // 生成页面模板文件
  htmlPlugins.push(new HtmlWebpackPlugin({
    template,
    filename: chunkName + '.html',
    chunksSortMode: 'none',
    chunks: [chunkName, 'js/common'],
    // favicon: './favicon.ico',
    inject: true,
    hash: false, // 开启hash  ?[hash]
    minify: isDev ? false : {
      removeComments: true, // 移除HTML中的注释
      collapseWhitespace: true, // 折叠空白区域 也就是压缩代码
      removeAttributeQuotes: true // 去除属性引用
    }
  }));
}

2.3 全局配置jquery,之前按照网上的教程,jquery代码可以跑起来,但是在浏览控制台里运行报如下错误:

new webpack.ProvidePlugin({
	$: 'jquery',
	jQuery: 'jquery'
})
感觉这么配置起来没问题,在控制打印就gg了...报错如下

为解决这个问题,查了一些资料,看到有大佬说用expose-loader可以完美解决。二话不说,激动的立马cnpm了

cnpm install -D expose-loader

// 在webpack.config.js里配置后,搞定以上报错
    rules: [
      {
        // 通过require('jquery')来引入
        test: require.resolve('jquery'),
        use: [
          {
            loader: 'expose-loader',
            // 暴露出去的全局变量的名称 随便你自定义
            options: 'jQuery'
          },
          {
            // 同上
            loader: 'expose-loader',
            options: '$'
          }
        ]
      }]

3. 复制静态文件至dist指定目录,打包前先删除原dist目录

3.1 这些功能实现,我们需要依赖两个插件copy-webpack-plugin,clean-webpack-plugin

cnpm install -D clean-webpack-plugin clean-webpack-plugin
// 配置插件
new CleanWebpackPlugin(resolve('dist')), // 自动删除指定目录文件配置
new CopyWebpackPlugin([ // 支持输入一个数组, 静态资源引入拷贝
	{
		from: resolve('src/assets'), // 将src/assets下的文件
		to: './assets' // 复制到dist目录下的assets文件夹中
	}
])

4. 处理less,css 文件,自动添加浏览器前缀

4.1 安装相关依赖

cnpm install -D 
postcss-loader 
less less-loader 
mini-css-extract-plugin 
css-loader 
autoprefixer

4.2 在项目根目录新建.postcss.config.js,配置内容如下

module.exports = {
 plugins: [
   require('autoprefixer')({
     browsers: ['cover 99.5% in CN']
   })
 ]
}
// 也可以在package.json 中配置,官方推荐模式
"browserslist": ["cover 99.5% in CN"]

4.3 在webpack.config.js 里配置规则和插件模式

{
   test: /\.css$/,
   use: [
   	MiniCssExtractPlugin.loader,
   	'css-loader',
   	'postcss-loader'
   	]	
}
// 在plugins中配置
new MiniCssExtractPlugin({
   	filename: '[name].min.css'
}),

4.4 npm run build 后,成功打包,但是html 图片资源路径加载出问题了。我这里使用了 html-withimg-loader 插件进行处理,css背景图路径问题,在图片处理规则中添加 publicPath: '../'

{ // html
   test: /\.(htm|html)$/i,
   loader: 'html-withimg-loader'
}

{ // images
   test: /\.(png|jpeg|jpg|gif|svg)(\?.*)?$/,
   use: [{
   	loader: 'url-loader',
   	options: { // options选项参数可以定义多大的图片转换为base64
   		limit: 10 * 1024,
   		name: 'assets/images/[name].[ext]',
   		publicPath: '../' // 解决css背景图的路径问题
   	}
   }]
}

4.5 成功打包的dist目录


5.导入公共的html文件

5.1 没有用其他模板语法来处理,在npm上找到了个html-withimg-loader,可以处理Html里图片资源路径问题和导入一些共用的html文件

   // 安装相关依赖
cnpm instal html-withimg-loader -D
// 配置规则
{ // html
   test: /\.(htm|html)$/i,
   loader: 'html-withimg-loader'
}
// 在html文件中引用模板文件
   #include("../../layout/tpl_head.html")

6.demo地址

GitHub - levai/webpack4_-: webpack4 多入口 简单配置demo