
Research
Supply Chain Attack on Axios Pulls Malicious Dependency from npm
A supply chain attack on Axios introduced a malicious dependency, plain-crypto-js@4.2.1, published minutes earlier and absent from the project’s GitHub releases.
@xunhou/webpack
Advanced tools
vscode 需添加以下插件
views 组件里的 css 需在最外层有一个作用域 id, id 名与 views 目录名一致,小写。
只有需要复用的组件才需要把样式写到组件内,组件内的样式采用css私有化写法,
详见styled-jsx
component里组件一率采用私有化写法。
同时私有化写法应有固定的命名前缀 c-, 原因与css私有化的方式有关。
路由路径统一在router/config里进行配置, webpack 会自动依据路由的 config 文件配置,进行分片打包。
原则上只需要分片的路由,即大页面才需要维护在 config 文件里,如果是页面内小的子路由,则应在 views 的
页面组件内使用 router-dom 设定。
config 配置中会有 hook 回调函数,用来做路由拦截,即在路由发生跳转前,进行一些操作,比如用户权限验证等。
{
path: '/home',
title: '首页',
exact: true,
hook(props) {
/*
resolve(true) 直接加载相应页面
也可以 resolve(<Com />) 一个组件,将用来展示该组件
同时hook也可以接收参数,参数是当前路由信息
也可以做一个跳转 props.history.push('/about')
*/
return new Promise((resolve) => {
setTimeout(() => resolve(true), 2000)
})
},
component: () => import(/* webpackChunkName: "Home" */ '@views/Home')
},
你可以有选择性的将路由放在指定容器内,而不是整个页面。
比如,你有一个固定的菜单,不想随路由变化而变化,可以在router/index.js自定制
const App = () => {
let location = useLocation() // 通过hook获取location
if (/^resume\/showresumedetail/.test(location.pathName)) {
return (
<>
<Header type="simple" /> {/* 我是简头 不会随路由的变化而重新加载 */}
<AsyncRouter config={config} /> {/* 我是通过config配置的路由 */}
</>
)
} else {
return (
<>
<Header />
<AsyncRouter config={config} />
</>
)
}
}
"scripts": {
"start": "fet-service start", // 编译
"deploy": "zctl front_delay --env", // 发布测试环境
"build": "fet-service prd" // 发布到青龙
"fix": "fet-service fix", // 格式化代码
"svgo": "fet-service svgOptimizer", // 压缩svg
"clear": "fet-service clear", // 清理缓存
},
最常用的命令, 编译并预览, 其中所有 ajax 请求会被代理到webpack.config.js里配置的后台地址上。
注意: 通过start, dev命令,css均会打包到js中,而不会抽出单独的css文件,这是因为MiniCssExtractPlugin与缓存插件存在冲突,所以只有在prd时,才会调用MiniCssExtractPlugin形成独立的css文件,如果需要测试,可通过prd方式查看css抽取情况。
会执行npm run build 然后发布对应的测试环境: npm run deploy qa67 / qa39
生成带版本号的文件
使用 prettier 以及 eslint 格式化你的代码到标准格式
对 src 目录下所有的 svg 进行压缩。
系统在编译时使用了缓存以达到下次编译速度更快的目的, 但有些时候缓存会造成你的更改不能及时更新, 目前已知 的情况都可以自动更新缓存, 但不排除有些情况会出现问题, 当你的修改没有生效时, 通过此命令清除缓存, 再 重新编译
对 webpack 进行配置。
output为对象时代表在默认值的基础上新增值
当output为函数时可覆盖默认配置, 如:
output({config, isDevj, isPrd, isHot}){
return config
}
值为 true|false, 在编译时, 是否启用 eslint。
watching 时忽略的目录, 可提高性能, 默认会忽略 node_modules 里除@xxx 下的所有文件。 默认配置
{
watchIgnored: ['node_modules', 'asset-dev', 'asset'],
watchInclude: ['node_modules/@xxx']
}
babel 需要解析的目录, 同样这样儿限定也是为了提高性能。
默认只编译@xxx下的资源。
如果想编译其它资源
比如百川项目需要编译@xxx下的资源, 那么可以这么配置
{
// ...
babelLoaderInclude: ['node_modules/@xxxx']
// ...
}
新增loader
{
loader: [
{
test: /\.jpg$/,
use: [
{
loader: 'file-loader',
},
],
},
]
}
修改默认loader, 可使用function的形式, 把所有配置项返回再做修改,
loaders代表默认loaders,每个loader会有个key属性,可根据key属性
覆盖指定loader。
loader(loaders, isPrd, isHot, isDev){
return loaders
}
插件,正常添加一个插件可直接在数组里增加,若想完全覆盖默认的插件配置,可通过函数进行覆盖。
/*
@plugins 当前编译环境下的默认配置,
@allPlugins 为包含所有内置 plugins 的对象, 你可以根据需求进行自由拼装,然后返回。
@isPrd,isHot,isDev 为 3 种编译环境(prd,start, dev)
*/
plugins({ plugins, isPrd, isHot, isDev, allPlugins }) {
if (isPrd || isDev) {
// 因为此插件会引发两次watch,所以只在生成文件时使用
return [...plugins, new AntdDayjsWebpackPlugin()]
}
return [...plugins]
},
可设置将配置规则的内容打到一个文件中
你可以将经常用到的包合并到 common 中, 以此来避免重复打包。
同时所有以路由形式拆分打包的,都将遵循默认的 webpack 异步拆包标准。
详见 https://webpack.js.org/plugins/split-chunks-plugin/#optimizationsplitchunks
const transfer = (arr) => new RegExp(arr.map((v) => `[\\/]node_modules[\\/]${v}`).join('|'))
// ...
// 这些是默认配置
// {
// 'polyfill-vendors': {
// chunks: 'all',
// test: transfer(['core-js']),
// priority: 10,
// name: 'polyfill-vendors',
// enforce: true
// },
// 'react-vendors': {
// chunks: 'all',
// test: transfer([
// 'react',
// 'react-dom',
// 'prop-types',
// '@hot-loader/react-dom',
// 'react-router-dom',
// 'axios',
// 'classnames',
// 'mobx',
// 'mobx-react-lite'
// ]),
// priority: 10,
// name: 'react-vendors',
// enforce: true
// }
// }
splitChunks: {
commonCss: {
chunks: 'all',
name: 'common',
test: /\/src\/common\/css\/index\.less/,
enforce: true
},
common: {
chunks: 'all',
test: transfer(['dayjs', 'nprogress', 'styled-jsx']),
name: 'common',
enforce: true
}
},
eslint 规则请参考 https://alloyteam.github.io/eslint-config-alloy/ 根目录下.eslintrc.js 为 eslint 配置文件, 通过它可实现自己想要的规则。
其中几个规则与参考不同
//0 (off) 1(warning) 2(error)
'no-debugger': isPrd() ? 2 : 1,
'no-new': 0,
'no-param-reassign': 0,
'radix': 0,
FAQs
前端webpack配置
We found that @xunhou/webpack demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Research
A supply chain attack on Axios introduced a malicious dependency, plain-crypto-js@4.2.1, published minutes earlier and absent from the project’s GitHub releases.

Research
Malicious versions of the Telnyx Python SDK on PyPI delivered credential-stealing malware via a multi-stage supply chain attack.

Security News
TeamPCP is partnering with ransomware group Vect to turn open source supply chain attacks on tools like Trivy and LiteLLM into large-scale ransomware operations.