123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- const { DefinePlugin } = require("webpack");
- const HtmlWebpackPlugin = require("html-webpack-plugin");
- const TerserWebpackPlugin = require("terser-webpack-plugin");
- const MiniCssExtractPlugin = require("mini-css-extract-plugin");
- const VueLoaderPlugin = require("vue-loader/lib/plugin");
- const resolveApp = require("./paths");
- module.exports = (isProduction) => {
- const cssFinalLoader = isProduction
- ? MiniCssExtractPlugin.loader
- : "style-loader";
- return {
- entry: "./src/main.js",
- output: {
- path: resolveApp("dist"),
- filename: "js/[name].[hash:6].js",
- chunkFilename: "js/[name].chunk.[hash:4].js",
- },
- resolve: {
- extensions: [".js", ".jsx", ".vue", ".json", "..."],
- alias: {
- "@": resolveApp("src"),
- },
- },
- externals: {
- // 不希望依赖打进包中,走外链cdn等
- // '$': 'Jquery',
- // react: 'React',
- // 'react-dom': 'ReactDOM',
- // 'prop-types': 'PropTypes',
- // moment: 'moment',
- // antd: 'antd',
- // classnames: 'classNames',
- },
- module: {
- rules: [
- // vue文件处理
- {
- test: /\.vue$/,
- use: "vue-loader",
- },
- // less文件处理
- {
- test: /\.less$/,
- use: [
- cssFinalLoader,
- {
- loader: "css-loader",
- options: {
- importLoaders: 2,
- },
- },
- "postcss-loader",
- "less-loader",
- ],
- },
- // css文件处理
- {
- test: /\.css$/,
- use: [
- cssFinalLoader, // 最终要以style标签输出到页面
- {
- loader: "css-loader",
- options: {
- esModule: false, // css不使用esModule,直接输出
- importLoaders: 1, // 使用本loader前使用1个其他处理器
- },
- },
- "postcss-loader",
- ],
- sideEffects: true, // 希望保留副作用
- },
- // 图片类处理
- {
- test: /\.(png|gif|jpe?g|svg)$/,
- type: "asset", // webpack5使用内置静态资源模块,且不指定具体,根据以下规则 使用
- generator: {
- filename: "img/[name].[hash:6][ext]", // ext本身会附带 点,放入img目录下
- },
- parser: {
- dataUrlCondition: {
- maxSize: 10 * 1024, // 超过10kb的进行复制,不超过则直接使用base64
- },
- },
- },
- // 字体类处理
- {
- test: /\.(ttf|woff2?|eot)$/,
- type: "asset/resource", // 指定静态资源类复制
- generator: {
- filename: "font/[name].[hash:6][ext]", // 放入font目录下
- },
- },
- // 脚本类处理
- {
- test: /\.jsx?$/,
- exclude: /node_modules/, // 过滤掉node_modules目录,只使用而已
- use: "babel-loader", // js、jsx使用bable-loader处理
- },
- {
- test: /\.(vue|js)$/,
- use: "eslint-loader",
- exclude: /node_modules/,
- enforce: "pre",
- },
- {
- test: /\.mjs$/,
- include: /node_modules/,
- type: "javascript/auto",
- },
- ],
- },
- plugins: [
- new DefinePlugin({
- BASE_URL: '"./"',
- }),
- new HtmlWebpackPlugin({
- title: "DeepBIO",
- template: "public/index.html",
- }),
- new VueLoaderPlugin(),
- ],
- optimization: {
- runtimeChunk: true, // 模块抽取,利用浏览器缓存
- minimizer: [
- new TerserWebpackPlugin({
- extractComments: false, // 不要注释生成的文件
- }),
- ],
- },
- };
- };
|