博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
webpack 自动发现 entry 的配置和引用方式
阅读量:6330 次
发布时间:2019-06-22

本文共 3179 字,大约阅读时间需要 10 分钟。

假定我们的项目目录为如下的样子:

- root/    - assets/        - app/            - global.js            - index/                - index.js            - auth/                - login.js                - register.js                - ...        - webpack.config.js    - public/        - assets/            - build/

使用如下的 webpack 配置:

var webpack = require('webpack');var fs = require('fs');var path = require('path');var glob = require('glob');const debug = process.env.NODE_ENV !== 'production';function entries (globPath) {    var files = glob.sync(globPath);    var entries = {}, entry, dirname, basename;    for (var i = 0; i < files.length; i++) {        entry = files[i];        dirname = path.dirname(entry);        basename = path.basename(entry, '.js');        entries[path.join(dirname, basename)] = './' + entry;    }    return entries;}module.exports = {    entry: entries('app/**/*.js'),    output: {        path: path.join(__dirname, '..', 'public', 'assets', 'build'),        publicPath: '/assets/build/',        filename: '[name]' + (debug ? '' : '-[chunkhash]') + '.js',        chunkFilename: '[id]' + (debug ? '' : '-[chunkhash]') + '.js'    },    plugins: [        function () {            this.plugin('done', function (stats) {                stats = stats.compilation.getStats().toJson({                    hash: true,                    publicPath: true,                    assets: true,                    chunks: false,                    modules: false,                    source: false,                    errorDetails: false,                    timings: false                });                var json = {}, chunk;                for (var key in stats.assetsByChunkName) {                    if (stats.assetsByChunkName.hasOwnProperty(key)) {                        chunk = stats.assetsByChunkName[key];                        json[key + '.js'] = chunk[0];                    }                }                fs.writeFileSync(                    path.join(__dirname, '..', 'public', 'assets', 'build', 'rev-manifest.json'),                    JSON.stringify(json, null, 2)                );            });        }    ]};

这样,我们就可以得到形如这样的构建输出:

- root/    - assets/        - ...    - public/        - assets/            - build/                - rev-manifest.json                - app/                    - global.js                - auth/                    - login.js                    - register.js                    - ...

意义何在???

关键在于 rev-manifest.json 文件,我们查看一下文件内容:

{  "app/global.js": "app/global.js",  "app/index/index.js": "app/index/index.js",  "app/auth/login.js": "app/auth/login.js",  "app/auth/register.js": "app/auth/register.js",}

意义何在???

好吧,我们再看一下在生产环境下的构建输出:

{  "app/global.js": "app/global-6ff91e44b26765ae797a.js",  "app/index/index.js": "app/index/index-d294c62e36a91fa7237d.js",  "app/auth/login.js": "app/auth/login-f04b1d5a3cffac4d70aa.js",  "app/auth/register.js": "app/auth/register-502d794e8e0c7f1a230d.js",}

如果配合模板中的函数:

    
Title

assets_url 函数可以直接获取 rev-manifest.json 内容,根据给定的 key 得到对应的构建文件的可访问路径,自动的根据不同的环境获取到正确的引用结果。

同时,我们可以在源代码目录里面,根据需求对代码进行模块化管理,构建出来的代码结构会和我们源代码中管理的一致。

这样一来,既可以享受构建系统的优势,又无需在新增或修改模块时改动 webpack.config.js,是不是很方便呢?

转载地址:http://njboa.baihongyu.com/

你可能感兴趣的文章
SQL数据库无法附加,提示 MDF" 已压缩,但未驻留在只读数据库或文件组中。必须将此文件解压缩。...
查看>>
第二十一章流 3用cin输入
查看>>
在workflow中,无法为实例 ID“...”传递接口类型“...”上的事件“...” 问题的解决方法。...
查看>>
获取SQL数据库中的数据库名、所有表名、所有字段名、列描述
查看>>
Orchard 视频资料
查看>>
简述:预处理、编译、汇编、链接
查看>>
调试网页PAIP HTML的调试与分析工具
查看>>
路径工程OpenCV依赖文件路径自动添加方法
查看>>
玩转SSRS第七篇---报表订阅
查看>>
WinCE API
查看>>
POJ 3280 Cheapest Palindrome(DP 回文变形)
查看>>
oracle修改内存使用和性能调节,SGA
查看>>
SQL语言基础
查看>>
对事件处理的错误使用
查看>>
最大熵模型(二)朗格朗日函数
查看>>
深入了解setInterval方法
查看>>
html img Src base64 图片显示
查看>>
[Spring学习笔记 7 ] Spring中的数据库支持 RowMapper,JdbcDaoSupport 和 事务处理Transaction...
查看>>
FFMPEG中关于ts流的时长估计的实现(转)
查看>>
Java第三次作业
查看>>