webpack/node环境下是否存在类似文件include的等效功能?
实现需求的可用方案如下
方案1:使用webpack生态的script-loader(适配Webpack/VueCLI场景)
script-loader是webpack官方维护的loader,作用就是将目标JS文件的内容原样注入到引入位置,不会被webpack的模块系统封装,完全符合你要的类服务端包含效果。
- 安装依赖
npm install script-loader --save-dev
- 临时使用方式(无需修改配置)
直接修改入口文件的引入语法,添加loader前缀即可:
// project-a.js import '!script-loader!./base.js'; console.log('Project functionality');
- 全局配置方式(无需每次写前缀)
在VueCLI项目的vue.config.js中新增loader规则:
// vue.config.js module.exports = { chainWebpack: config => { config.module .rule('raw-script') .test(/\.raw\.js$/) // 你可以自定义要识别的文件后缀,比如将公共基础文件命名为base.raw.js .use('script-loader') .loader('script-loader') .end() } }
配置完成后直接正常引入即可:import './base.raw.js'
方案2:使用Node.js脚本预编译(无webpack依赖侵入)
如果不想额外引入webpack loader,也可以写简单的Node脚本在打包前做文本替换实现完全的原样插入:
- 新建预处理脚本prebuild.js
const fs = require('fs') const path = require('path') // 读取公共基础文件内容 const baseContent = fs.readFileSync(path.resolve(__dirname, './src/base.js'), 'utf8') // 读取项目入口模板文件 let projectTemplate = fs.readFileSync(path.resolve(__dirname, './src/project-a.template.js'), 'utf8') // 替换占位符 projectTemplate = projectTemplate.replace('/* {{INCLUDE_BASE}} */', baseContent) // 输出实际打包用的入口文件 fs.writeFileSync(path.resolve(__dirname, './src/project-a.js'), projectTemplate)
- 修改原有入口文件命名为
project-a.template.js,在需要插入基础代码的位置添加占位符/* {{INCLUDE_BASE}} */ - 修改package.json的打包命令,增加预处理步骤:
{ "scripts": { "build": "node prebuild.js && vue-cli-service build" } }
方案3:使用webpack内置BannerPlugin(仅适用基础代码放在文件开头的场景)
如果你的公共基础代码需要固定放在所有项目JS文件的最顶部,不需要指定插入位置,可以直接用webpack自带的BannerPlugin实现:
// vue.config.js const fs = require('fs') const baseContent = fs.readFileSync('./src/base.js', 'utf8') module.exports = { configureWebpack: { plugins: [ require('webpack').BannerPlugin({ banner: baseContent, raw: true, // 关键配置:原样输出内容不包裹注释 entryOnly: true // 仅给入口文件添加内容,不会侵入依赖文件 }) ] } }
注意:所有要原样插入的JS文件不要使用ES模块语法(
import/export),否则插入后直接作为普通脚本执行会报语法错误,按照普通JS脚本的规范编写即可。
内容的提问来源于stack exchange,提问作者Ben Hull
相关产品推荐
相关产品推荐

