English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Sobre a configuração e uso do webpack, há muitos artigos na internet, a maioria fala sobre aplicações single-page, quando precisamos empacotar vários html, as coisas ficam complicadas. Como empacotar vários html no webpack-dev-No server, use rotas? Como empacotar vários html e chunks de js e atualizar md automaticamente5?Este artigo é sobre como resolver esses problemas.
Aqui suponho que você já tenha uma compreensão básica do Webpack
Necessidades
Vamos ver nossas necessidades:
Estrutura principal do diretório
├── src │ └── views # Cada pasta corresponde a uma página │ └── a │ └── index.js │ └── b │ └── index.js ├── output # Diretório de saída do pacote | └── ... └── template.html # Gerar os html de várias páginas com base neste modelo └── webpack.config.js └── dev-server.js # webpack-dev-server + express
Apenas lista os diretórios principais, aqui geramos várias páginas html com base em um template.html, que diferem apenas nos caminhos dos recursos de referência. Claro, você também pode usar um template html separado para cada página.
Configuração do webpack
Aqui resolve dois pequenos problemas.
1Empacotar múltiplos arquivos js de páginas
Ler src/Cada diretório sob views, é conveniente tratado como uma página, empacotada em um chunk js.
2Empacotar múltiplos html
Gerar múltiplos plugins HtmlWebpackPlugin, cada plugin aponta os chunks individuais para os chunks js empacotados acima.
// webpack.config.js var glob = require('glob'); var webpackConfig = { /* Configurações básicas do webpack */ }; // Obter os arquivos de entrada na pasta especificada function getEntries(globPath) { var files = glob.sync(globPath), entries = {}; files.forEach(function(filepath) { // Usar o penúltimo nível (pasta abaixo de view) como nome do pacote var split = filepath.split('/'); var name = split[split.length - 2]; entries[name] = '.',/' + filepath; }); return entries; } var entries = getEntries('src/view/**/index.js'); Object.keys(entries).forEach(function(name) { // Gerar um entry para cada página, se necessário HotUpdate, aqui é onde você modifica o entry webpackConfig.entry[name] = entries[name]; // Gerar um arquivo html para cada página var plugin = new HtmlWebpackPlugin({ // Nome do arquivo html gerado filename: name + '.html', // 每个html的模版,这里多个页面使用同一个模版 template: './template.html', // 自动将引用插入html inject: true, // 每个html引用的js模块,也可以在这里加上vendor等公用模块 chunks: [name] }); webpackConfig.plugins.push(plugin); }
路由配置
在多页应用下,我们希望访问的是localhost:8080/a,而不是localhost:8080/a.html。
由于webpack-dev-server只是将文件打包在内存里,所以你没法在express里直接sendfile('output/views/a.html'),因为这个文件实际上还不存在。还好webpack提供了一个outputFileStream,用来输出其内存里的文件,我们可以利用它来做路由。
注意,为了自定义路由,你可能需要引进express或koa之类的库,然后将webpack-dev-server作为中间件处理。
// dev-server.js var express = require('express') var webpack = require('webpack') var webpackConfig = require('./webpack.config') var app = express(); // webpack编译器 var compiler = webpack(webpackConfig); // webpack-dev-server中间件 -dev-middleware publicPath: webpackConfig.output.publicPath, stats: { colors: true, chunks: false } }); app.use(devMiddleware) // roote app.get('/:viewname? function(req, res, next) { var viewname = req.params.viewname ? req.params.viewname + '.html' : 'index.html'; var filepath = path.join(compiler.outputPath, viewname); // Use o outputFileSystem fornecido pelo webpack compiler.outputFileSystem.readFile(filepath, function(err, result) { if (err) { // erro algo return next(err); } res.set('content-type/html'); res.send(result); res.end(); }); }); module.exports = app.listen(8080, function(err) { if (err) { // faça algo return; } console.log('Escutando em http://localhost: + port + "\n') }
Por fim, defina o comando de inicialização no package.json:
// package.json { scripts: { "dev": "node ./dev-server.js } }
Execute npm run dev e, em seguida, acesse localhost:8080/Em todas as páginas, você deve poder ver o resultado desejado.
Isso é tudo o que há no artigo, esperamos que ajude na sua aprendizagem e que você apóie o Tutorial Yell.
Declaração: o conteúdo deste artigo é de origem na Internet, pertence ao autor original, foi contribuído e carregado voluntariamente pelos usuários da Internet, o site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidade legal. Se você encontrar conteúdo suspeito de violação de direitos autorais, seja bem-vindo a enviar e-mail para: notice#oldtoolbag.com (ao enviar e-mail, substitua # por @ para denunciar e forneça provas relevantes. Se confirmado, o site deletará imediatamente o conteúdo suspeito de violação de direitos autorais.)