javascript - Phoenix 1.4 服务器正在交付默认 HTML 而不是请求的 JS 文件
问题描述
我正在尝试直接在我的 Phoenix 1.4 应用程序中渲染 Vue.js。但是安装Vue-router后出现如下错误:
拒绝执行来自“ http://localhost:4000/0.app.js ”的脚本,因为它的 MIME 类型 ('text/html') 不可执行,并且启用了严格的 MIME 类型检查。
我的 Phoenix router.ex 文件如下所示:
scope "/", Web do
pipe_through :browser
get "/*path", PageController, :index
end
我的 webpack.config.js:
const path = require('path');
const glob = require('glob');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const VueLoaderPlugin = require('vue-loader/lib/plugin')
module.exports = (env, options) => ({
resolve: {
alias: {
'vue$': 'vue/dist/vue.esm.js'
},
extensions: ['*', '.js', '.vue', '.json']
},
optimization: {
minimizer: [
new UglifyJsPlugin({ cache: true, parallel: true, sourceMap: false }),
new OptimizeCSSAssetsPlugin({})
]
},
entry: {
'./js/app.js': glob.sync('./vendor/**/*.js').concat(['./js/app.js'])
},
output: {
filename: 'app.js',
path: path.resolve(__dirname, '../priv/static/js')
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader'
}
},
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, 'css-loader']
},
{
test: /\.vue$/,
loader: 'vue-loader'
},
{
test: /\.s(c|a)ss$/,
use: [
'css-loader',
{
loader: 'sass-loader',
// Requires sass-loader@^7.0.0
options: {
implementation: require('sass'),
fiber: require('fibers'),
indentedSyntax: true // optional
}
}
]
},
{ test: /\.(png|woff|woff2|eot|ttf|svg)$/, use: 'url-loader' }
]
},
plugins: [
new MiniCssExtractPlugin({ filename: '../css/app.css' }),
new CopyWebpackPlugin([{ from: 'static/', to: '../' }]),
new VueLoaderPlugin()
]
});
我目前看到(我认为)缓存清单存在问题,我的网站可以正确地交付 HTML 和 CSS 文件,但对于 JS 文件,正在交付默认的 HTML 模板 - 这会导致错误。
我可以在 Chrome 开发工具网络选项卡中看到,此请求http://localhost:4000/0.app.js的响应是 app.html.eex 文件。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>Phoenix Framework</title>
</head>
<body>
<div id="vue-app"></div>
<script type="text/javascript" src="<%= Routes.static_path(@conn, "/js/app.js") %>"></script>
</body>
</html>
非常感谢任何帮助。
解决方案
如果您使用通配符包罗万象的路由来显示您的索引页面,并且对资源的请求正在访问该路由,这意味着Plug.Static
您的endpoint.ex
.
我们的看起来像这样:
plug Plug.Static,
at: "/", from: :my_app_name, gzip: true,
only: ~w(css images js favicon.ico robots.txt fonts)
在你做之前把它放在任何地方plug MyApp.Router
。
另一个原因可能是它0.app.js
根本不存在于priv/static/js
. 检查那里以查看它是否实际上未被调用app.js
或是否在其名称后附加了一个散列。
推荐阅读
- c - 为什么编译器仅在布尔不等式中使用时不优化增量?
- python - 使用登录页面在 Python 中进行 Web 抓取
- r - 强制ggplot2中一个方面的x轴标签
- java - 从 Java 8 中的过滤器和映射调用自定义静态函数 - 流
- swift - 为什么类的常量实例可以在属性值中更改?
- java - 在socket通信中设置FIN & RST
- python - 使用 numpy. binary_repr 上的数字或替代数组 - Python
- python - 如何将Django源安装转换为包安装
- mysql - mysql中使用count()和join时返回错误值
- graph - 如何将单元格中的字符串用作图形数据范围?