imtiaz January 19, 2021, 5:52pm 1 Hi, I’m new to Phoenix. I’m using 1.5 to build a web application. I want to use materializecss . I know I can directly copy the cdn urls and paste it to layout file. But I want to do it via npm. So, I found this package materialize-css and installed it inside the assets
folder using npm install materialize-css@next --save
.
The problem I’m facing is, I included @import "~materialize-css/dist/css/materialize.min.css";
in my app.scss file. Also, added import "materialize-css/dist/js/materialize.min";
in my app.js file.
When I run mix phx.server
it’s giving me error
ERROR in multi ./js/materialize.min.js Module not found: Error: Can’t resolve ‘./js/materialize.min.js’ in ‘/Users/imtiaz/Etectra/work/recyclebin/assets’ @ multi ./js/materialize.min.js materialize[0]
Any idea how to resolve it?
Hello and welcome,
Try to change this to…
import "../node_modules/materialize-css/dist/js/materialize.min";
2 Likes
imtiaz January 20, 2021, 3:01am 3 Thanks @kokolegorille . It doesn’t solve the problem. I guess it’s showing this because inside my webpack.config.js
there is a line:
entry: { 'app': glob.sync('./vendor/**/*.js').concat(['./js/app.js']), 'materialize': glob.sync('./vendor/**/*.js').concat(['./js/materialize.min.js']) },
I removed the line with materialize and it removes the error. Not sure why I’m getting jquery is undefined.
I installed jquery via npm and added
new webpack.ProvidePlugin({ $: "jquery", jQuery: "jquery" })
inside webpack.config.js file’s plugin section.
Also, in app.js
added:
import $ from 'jquery'; window.jQuery = $; window.$ = $;
Any idea? I know it’s a question inside another question, but I’m a newbie and getting issues every time
It’s something I had to do for BS4, luckily now BS5 dropped jquery.
I try not to include jquery. JS has evolved enough not to need it anymore.
But when needed, I found some different solutions, one is to use splitChunks.
module.exports = (_env, options) => { optimization: { splitChunks: { cacheGroups: { vendor: { test: /bootstrap|jquery|popper.js/, chunks: "initial", name: "vendor", enforce: true } } }, minimizer: [ new TerserPlugin({}), new CssMinimizerPlugin({}) ] }, ... plugins: [ ... new webpack.ProvidePlugin({ // inject ES5 modules as global vars $: "jquery", jquery: "jquery", "window.jQuery": "jQuery", Popper: ["popper.js", "default"], }) ] }
Nothing special in app.js (remove your code)
And modify layout like this.
<script type="text/javascript" src="<%= Routes.static_path(@conn, "/js/vendor.js") %>"></script> <script type="text/javascript" src="<%= Routes.static_path(@conn, "/js/app.js") %>"></script>
The example is for bootstrap 4, so You can remove popper too.
Now I try to avoid css framework with jquery dependency.
Needless to say it’s a real pain
imtiaz January 20, 2021, 4:52am 5 Seems like a real pain adding jquery. Now, everything fall apart. materialize.min.js
giving errors that jQuery is not defined
I guess, need to find a css framework without jquery dependency
I tried materialize-css some years ago, but now I would try
or the lite version.
Hi guys,
I can not figure out a working solution for Phoenix 1.5 (incl. Liveviews) + materializecss . Webpack Version is 4.41.5.
A working result should achieve the following working: Side-Nav-Materializecss
So that I can call: $(".button-collapse").sideNav();
at the bottom of template or via liveview-hooks.
In my tries to get a solution (alot of hours by now), I also face the “jquery ($ not found)” problem.
Is there someone out with a working solution?
Thanks so much for the help!
How do You load jQuery?
It might not be available yet and You might need to use something like…
document.addEventListener("DOMContentLoaded", function(){ // Code }
I tried a modification in the default generated ‘app.js’ in previous tries:
window.addEventListener(“phx:page-loading-start”, info => { topbar.show() $(“.button-collapse”).sideNav() })
Current state of Chrome-Console:
Uncaught TypeError: Cannot read property ‘scrollHeight’ of null at rc2Contentscript.js:249 (anonymous) @ rc2Contentscript.js:249 setInterval (async) listenToParent @ rc2Contentscript.js:246 (anonymous) @ rc2Contentscript.js:626 localhost/:10
GET http://localhost:4005/js/vendor.js net::ERR_ABORTED 404 (Not Found)
app.js?7473:37 Uncaught TypeError: $(…).sideNav is not a function at eval (app.js?7473:37) at Object.dispatchEvent (phoenix_live_view.js?0c87:1) at e.value (phoenix_live_view.js?0c87:1) at e.value (phoenix_live_view.js?0c87:1) at e.value (phoenix_live_view.js?0c87:1) at eval (phoenix_live_view.js?0c87:1) at Array.forEach () at Object.all (phoenix_live_view.js?0c87:1) at e.value (phoenix_live_view.js?0c87:1) at t (phoenix_live_view.js?0c87:1)
What happens when You type $ in devtools console?
What is this rc2Contentscript.js?
What happens when You type $ in devtools console?
$
Returns:
ƒ $() { [native code] }
What is this rc2Contentscript.js? Good question, I guess its coming from webpack. It is not from my code: After searching the web I found following regarding nextcloud:
https://github.com/nextcloud/forms/issues/842
My webpack-Config looks like that:
const path = require(‘path’);
const glob = require(‘glob’);
const HardSourceWebpackPlugin = require(‘hard-source-webpack-plugin’);
const MiniCssExtractPlugin = require(‘mini-css-extract-plugin’);
const TerserPlugin = require(‘terser-webpack-plugin’);
const OptimizeCSSAssetsPlugin = require(‘optimize-css-assets-webpack-plugin’);
const CopyWebpackPlugin = require(‘copy-webpack-plugin’);
const webpack = require(‘webpack’);
module.exports = (env, options) => {
const devMode = options.mode !== ‘production’;
return {
optimization: { minimizer: [ new TerserPlugin({ cache: true, parallel: true, sourceMap: devMode }), new OptimizeCSSAssetsPlugin({}) ] }, entry: { 'app': glob.sync('./vendor/**/*.js').concat(['./js/app.js']) }, output: { filename: '[name].js', path: path.resolve(__dirname, '../priv/static/js'), publicPath: '/js/' }, devtool: devMode ? 'eval-cheap-module-source-map' : undefined, module: { rules: [ { test: /\.js$/, exclude: /node_modules/, use: { loader: 'babel-loader' } }, { test: /\.[s]?css$/, use: [ MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader', ], }, { test: /\.(woff(2)?|ttf|eot|svg)(\?v=\d+\.\d+\.\d+)?$/, use: [{ loader: 'file-loader', options: { name: '[name].[ext]', outputPath: '../fonts' } }] } ] }, plugins: [ new MiniCssExtractPlugin({ filename: '../css/app.css' }), new CopyWebpackPlugin([{ from: 'static/', to: '../' }]), new webpack.ProvidePlugin({ // inject ES5 modules as global vars $: "jquery", jquery: "jquery", "window.jQuery": "jQuery" }), new webpack.LoaderOptionsPlugin({ // test: /\.xxx$/, // may apply this only for some modules options: { splitChunks: { cacheGroups: { vendor: { test: /jquery.js/, chunks: "initial", name: "vendor", enforce: true } } } } }) ] .concat(devMode ? [new HardSourceWebpackPlugin()] : [])
}
};
I don’t remember WP 4 config.
A lot have changed since WP 5 and some tools are now obsolete.
Like CopyWebpackPlugin, HardSourceWebpackPlugin and Terser config.
I cannot help You on this, Webpack is such an annoying tool to configure.
Thanks anyway for trying!
Maybe someone else figured it out and can post a working sample code.