Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

从零开始一个前端脚手架(四) #46

Open
keep-run opened this issue Sep 18, 2021 · 1 comment
Open

从零开始一个前端脚手架(四) #46

keep-run opened this issue Sep 18, 2021 · 1 comment

Comments

@keep-run
Copy link
Owner

keep-run commented Sep 18, 2021

我们的cli工具现在虽然可以使用了,但是还是很简陋,这一节主要从以下两个方面去丰富其功能:

  • 打包css
  • 代理

css打包

css打包有两种形式,第一是借助style-loader.配置如下:

  {
    test: /\.css$/,
    exclude: /node_modules/,
    use: [require.resolve('style-loader'), require.resolve('css-loader')],
  },

这样会把css打包进js文件,最后以style标签的形式把css样式渲染在html中。这种方式在生产环境会产生一些问题:

  • 单个文件太大,影响加载;
  • 大量的css代码存在于html中,不利于排查问题以及样式覆盖;

第二种形式是借助插件MiniCssExtractPlugin。 把样式单独抽离出来打包成一个文件。在html中通过一个link标签引入即可,这也是当下主流的使用方式,配置如下:
配置loader:

  import MiniCssExtractPlugin from 'mini-css-extract-plugin'
  ...
  {
    test: /\.css$/,
    exclude: /node_modules/,
    use: [MiniCssExtractPlugin.loader, require.resolve('css-loader')],
  },

配置plugin(src/babel/plugins)

export default (config) => {
  return [
    ...
    new MiniCssExtractPlugin({
      filename: config.mode === 'development' ? 'bundle.css' : 'bundle.[contenthash].css'     //输出css文件名称,  开发环境,文件名不要带hash,带hash会做持久缓存,影响开发热更。  生产环境需要带hash,用于做缓存
    }),
  ]
}

这里有一个坑啊。 开发环境的css文件名不要带hash值。webpack官网有一个一句话的解释:

使用 filename: "[contenthash].css" 启动长期缓存。根据需要添加 [name]。

这导致一个什么问题呢,如果开发环境文件名称带了hash值,当我们修改css文件时,页面不会热更,所以这里文件名称会加入当前模式的判断。

代理

对于一个成熟的脚手架工具,开发过程中mock数据是一项基本且重要的操作。当然实现mock的方法有很多,比如常用的charles等。我们这里提供一个方法,代理到本地目录。省去各种配置。

基本原理是:devServer中拦截ajax请求,去本地读取某个文件作为接口返回。
commanders/strat.js中增加配置:

...
const { port, cwd, mock } = config  
...

{
  ...
    onBeforeSetupMiddleware: function (devServer) {
      if (devServer) {
        devServer.app.use((req, res, next) => {
          // 对于ajax请求,可以设置mock
          if (mock && req.headers['x-requested-with']) {  //请求头中增加 x-requested-with  早期ajax请求会自动加, 新的fetch没有了,需要手动加
            const filePath = path.join(cwd, `/mock/${req._parsedUrl.path}.json`)
            let mockData = {}
            try {
              mockData = require(filePath)
            } catch (err) {
              mockData = { message: `${filePath} is not a file` }
            }
            res.set('Content-Type', 'application/json')
            res.send(mockData)
          }
          next()
        })
      }
    }
}

几点解释:

  • mock字段作为配置,允许用户自定义。和其他配置字段一样在package.jsonsimple_cli字段下。
  • 发送请求的请求头中必须有x-requested-with字段,以此作为识别ajax请求的标识。
  • mock地址。在本地mock文件夹下。 比如请求路径为/test。则会读取本地目录:mock/test.json的值作为返回。

更多内容持续丰富中。

相关文章:

@keep-run
Copy link
Owner Author

update

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant